devise と omniauth を連携させて認証してみる

前回:omuniauth-github を使ってみる - IT技術にまつわる実験ノート

参考:OmniAuth: Overview · plataformatec/devise Wiki · GitHub

Devise と Omniauth を連携させる場合、Omniauth 単体だけで設定した  config/initializers/omniauth.rb を使わないとのこと:

f:id:matt-note:20180922205834p:plain

Devise で作成した User モデルに、provider と uid カラムを追加:

f:id:matt-note:20180922210616p:plain

config/initializers/devise.rb に設定を追加。ここでは GitHub で認証する。設定方法は、devise の README.md を参考にする:

f:id:matt-note:20180927202003p:plain

f:id:matt-note:20180922210848p:plain

とにかく、Wikiに書いてあるとおり app/models/user.rb に :omniauthable の設定を追加:

f:id:matt-note:20180923203849p:plain

これによって、Devise がルーティングを作ってくれるとのこと。$ rails routes | grep omniauth してみる:

f:id:matt-note:20180922212418p:plain

 このルーティングを使って、ログインボタンを作成する:

f:id:matt-note:20180922222608p:plain

このリンクをクリックすると、ユーザーは GitHub にリダイレクトされる。ユーザーが GitHub で認証した後に、サイトに戻ってくるためにコールバックを設定する必要があるとのこと:

f:id:matt-note:20180923193058p:plain

コールバックを実行するために、ルーティングを設定して、コントローラーを作成するとのこと:

f:id:matt-note:20180922214011p:plain

上記の設定では、app/controllers に users ディレクトリを作成して、その中に omniauth_callbacks_controller.rb を作成する。users ディレクトリを作成しなかった場合は、エラーになる。

参考:  ruby on rails - Routing Error uninitialized constant Users - Stack Overflow

 

GitHub設定画面から「Authorization callback URL」を設定する。callback の path は上記の rails routes で出てきた callback のパスを設定する。 /users/auth/github/callback のURL を設定して「Update application」をクリック:

f:id:matt-note:20180923204023p:plain

コントローラーに記述するコールバックメソッドは、プロバイダーと同じ名前にするとのこと。とにかく、写経して作成する:

f:id:matt-note:20180923211803p:plain

ユーザーモデルでメソッドを写経して定義する:

f:id:matt-note:20180923211928p:plain

 ログアウトの設定を記述する:

f:id:matt-note:20180923212315p:plain

サーバーを起動して、リンクをクリックして認証できるか確認する。ここではポートを8888番で設定したので、$ rails s -p 8888 でサーバーを起動して、ブラウザからアクセス:

f:id:matt-note:20180923212919p:plain

GitHubアカウントで登録する」のリンクをクリックして認証すると、「Githubから承認されました」と表示され、ログインできる:

f:id:matt-note:20180923212449p:plain

また、上記の「ログアウト」のリンクをクリックすると、ログアウトできる。

f:id:matt-note:20180923212703p:plain

 

その他の参考:

twitterアカウントでログイン devise+omniauth (rails5)

Devise+OmniAuthでQiita風の複数プロバイダ認証

OmniAuth を複数のモデルで使う場合:

OmniAuth with multiple models · plataformatec/devise Wiki · GitHub