hello-world
webエンジニアのメモ。とりあえずやってみる。

[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認証の完成です。

参考


Related #OmniAuth

[Rails]Omniauthで戻り先URLを指定する

Ruby2.0, Rails4.1で確認

[ruby]OmniAuth利用時に Authentication failure! timeout: Net::OpenTimeout, execution expired が発生

OmniAuthを使ったTwitter認証機能を試していた際に、

RailsでOmniauthを使ってTwitterログインする

Ruby2.0, Rails4で確認

OmniAuthで認証した後に、tweetしたりfollowしたりする

昨日、 RailsでOmniauthを使ってTwitterログインする方法をまとめました。