[Devise How-To] OmniAuth認証を複数のモデルで共用する方法(翻訳)

こんにちは、hachi8833です。引き続きDevise How-ToのOmniAuthシリーズをお送りします。

Devise Wikiもくじリンク

  1. 「ワークフローのカスタマイズ」
  2. 「認証方法のカスタマイズ」「OmniAuth」
  3. 「ビュー/コンテンツのカスタマイズ」「特権/認証」
  4. 「テスト」「特殊な設定」
  5. 「アプリでのその他の設定」「JavaScript」
  6. 「他の認証プラグインからの移行」「アップグレード」

概要

読みやすさのため、横に長いコードを途中で改行しています。

原文の更新や誤りにお気づきの場合は、ぜひ@techrachoまでお知らせください。更新いたします。

OmniAuth: OmniAuth認証を複数のモデルで共用する方法(翻訳)

現時点では、DeviseのOmniauthableモジュールはそのままでは1つのモデルでしか利用できません。しかしご安心ください。OmniauthableはOmniAuthの単純なラッパーにすぎないので、方法はあります。

OmniAuthを複数モデルで認証に使えるようにするには、次の手順を進めます。

1. モデルから:omniauthable引数を削除する

2. Deviseの設定ファイルからOmniAuthの設定を削除して新しいファイルに移動する

設定を切り出す前のdevise.rbが以下のようになっているとします。

Devise.setup do |config|
  config.omniauth :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end

上を削除して、以下のように新しいomniauth.rbファイルに保存します。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end

3. OmniAuth独自のルーティングを作成する

authentications_controller.rbというコントローラがある場合、次のようなルーティングを使います。

  • Rails 3、Rails 4の場合
get "/auth/:action/callback", :to => "authentications", 
                              :constraints => { :action => /twitter|google/ }
  • Rails 5の場合
get "/auth/:action/callback", :controller => "authentications",
                              :constraints => { :action => /twitter|google/ }

OmniAuthによるすべての認証を同じcreateアクションにルーティングしたい場合は、次のようにします。この方法はプロバイダの種類に依存しません。

get "/auth/:provider/callback" => "authentications#create"

マッピングエラーが発生する場合は、以下のようにルーティングをdevise_scopeでラップします。

devise_scope :user do
  get "/auth/:provider/callback" => "authentications#create"
end

4. OmniAuthのon_failureフックを設定する

この設定は、以下のようにOmniAuthの設定用ブロックの中で行えます。

Rails.application.config.middleware.use OmniAuth::Builder do
  on_failure { |env| AuthenticationsController.action(:failure).call(env) }
end

あるいは、以下のように設定用ブロックの外でも行えます。

OmniAuth.config.on_failure = Proc.new { |env| AuthenticationsController.action(:failure).call(env) }

Deviseにはこの2番目のオプションが実装されていますが、omniauth.rbファイルが設定済みなので、1番目のオプションの方がシンプルに書けます。

この設定では、認証の失敗(ユーザーのログインのキャンセルなど)はすべてauthentications_controller.rbコントローラのfailureアクションにリダイレクトされます。

5. OmniAuthでの認証エラー処理

このライブラリのエラーは残念ながらあまり標準化されていないため、Devise自身で行っているエラー処理と同様に多くの条件分岐を処理するしかありません。ここから使えそうなコードをコピペして何とかすることになります。

RailsCastsの「Simple OmniAuth」も設定の参考になります。

関連記事(Devise)

OminiAuth

その他

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ

BPSアドベントカレンダー