[rails]omniauth-google-oauth2を使ってGoogleアカウント認証をやってみる
これまでomniauthを使ったtwitter認証やfacebook認証は何度かやったことがあったのですが、Google認証はやってなかったので、「 omniauth-google-oauth2」を使ってGoogleアカウント認証をやってみました。
omniauthを使うとtwitter, facebook認証と同じくGoogleアカウント認証も手軽にできました。
1. Rails側の準備
- Gemfile 追加
gem 'omniauth'
gem 'omniauth-google-oauth2'
デバッグ用にpry-railsも追加しておきます。
group :test, :development do
gem 'pry-rails'
end
- omniauthの設定ファイルを追加
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, Settings.google_api.client_id, Settings.google_api.client_secret
end
OmniAuth.config.on_failure = Proc.new { |env|
OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}
client_id等の定数管理にはrails_configを使用しています。(詳細は こちら)
on_failureはログイン失敗(認証キャンセル)時の処理のために追加しています。
- 認証用controller作成
./bin/rails g controller sessions
サンプルとして認証用のコントローラ名をsessionsにしました。
- routing追加
get '/auth/:provider/callback' => 'sessions#callback'
post '/auth/:provider/callback' => 'sessions#callback'
get '/auth/failure' => 'sessions#failure'
get '/logout' => 'sessions#destroy'
- action作成
class SessionsController < ApplicationController
def callback
auth = request.env['omniauth.auth']
# auth情報を元にユーザをDB登録
# sessionにユーザIDを保持
binding.pry # デバッグ用
redirect_to root_path
end
def destroy
reset_session
redirect_to root_path
end
def failure
redirect_to root_path
end
end
コメントの部分は適宜実装してください。
今回はとりあえず、pryでデバッグできるようにしています。
特定のユーザしかログイン対象にしたくない場合、例えば会社内のみにしたい場合は、auth情報に会社情報が含まれているので会社ドメインかどうかで弾けばよさそうです。
class SessionsController < ApplicationController
def callback
auth = request.env['omniauth.auth']
raise (CustomError, 'permission denied') if auth['extra']['raw_info']['hd'] != '会社ドメイン'
# ・・・
end
end
- アプリケーション起動
./bin/rails s
これでrails側の準備が整いました。
2. Google側のOAuth設定
Rails 4.1 + devise + omniauth-google-oauth2 で認証機能を実装する | Oh My Enter!
↑の記事が画像付きの解説で分かりやすかったです。
今回はvagrant上の仮想マシンで試したため、「リダイレクトURI」の部分はローカルマシンのhostsを書き換えて対応しました。
# /etc/hosts
192.168.30.10 google-sample.local
192.168.30.10 のようにプライベートIPをリダイレクトURIに設定すると認証時にエラーが出るのでご注意ください。
Google側に設定するリダイレクトURIは「 http://google-sample.local/auth/google\_oauth2/callback 」になります。
3. 確認
rails側とGoogle側の設定が終わった状態で http://google-sample.local/auth/google\_oauth2 にアクセスすると認証画面が表示され、認証するとrails側でpryのデバッグ画面が表示されます。
あとは、auth変数の中身を確認して必要な情報をDB管理するようにすればGoogle認証の完成です。