はじめに
複数のモデルでのFacebook認証を実装しようとすると、
deviseではうまくいかない(deviseが単一モデルしか対応していない)
ため、deviseから外れた形で実現する必要がある。
日本語の情報が少ないため、覚書として記録しました。
環境
- ruby 2.2.1
- rails 4.2.3
前提
devise + omniauth-facebook
を利用してuserモデルのFacebook認証、ログインを実装済みであるところからスタートします。
よくあるこんな形ができてるのが前提です。
userモデルとanotherモデル両方でFacebookログインが可能である形をゴールとします。
実装手順
devise + omniauthableをやめる
まずdeviseの呪縛から開放しましょう。
1.下記の記述を消す。
devise :omniauthable
2.設定記述箇所を変更する
config.omniauth( :facebook,
[FACEBOOK_APP_ID],
[FACEBOOK_APP_SECRET],
scope: 'email',
info_fields: 'name, first_name, last_name, email' )
を消して
provider :facebook,
[FACEBOOK_APP_ID],
[FACEBOOK_APP_SECRET],
scope: 'email',
info_fields: 'name, first_name, last_name, email'
に移動する
3.deviseのomniauth_callbacks_controller.rbを使わないようにする
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
hoge
end
これを任意のcontrollerに移動し、routingもそれに合わせて書き換える。
users_controllerのfacebookメソッドに移動した場合は下記のようにする。
def facebook
hoge
end
get '/auth/facebook/callback', to: 'users#facebook'
view側の指定は下記。
<%= link_to 'facebookログイン', '/auth/facebook' %>
以上で、deviseのomniauthableを使わずに、omniauth-facebookのgemだけでfacebookログインができるようになります。
omniauthプロバイダを追加する
omniauth-facebookがやってくれていることを、同じようにもう一つ実装します。
facebookAPP側の設定ももう一つ必要なので、こちらでもう一つ作っておきます。
1.プロバイダを作る
lib/omniauth/strategies/以下に、
FacebookのAPIと認証・トークン取得などのやり取りをするプロバイダを
自前で作成しないといけないところを、すでに作ってくれているのがomniauth-facebookのgemです。
今回は、もう一つfacebookAPPとやりとりする別名のプロバイダを用意する必要があるので、omniauth-facebookをを継承して、option :nameの部分だけオーバーライドします。
module OmniAuth
module Strategies
class FacebookAnother < OmniAuth::Strategies::Facebook
option :name, 'facebook_another'
end
end
end
2.設定を追加する
新たに作ったfacebookAPPのIDとSECRETの設定を追加し、先ほど作ったプラグインをrequireで読み込みます。
require 'omniauth/strategies/facebook_another'
provider :facebook_another,
[FACEBOOK_ANOTHER_APP_ID],
[FACEBOOK_ANOTHER_APP_SECRET],
scope: 'email',
info_fields: 'name, first_name, last_name, email'
3.コールバックメソッドを実装する
任意のcontrollerにメソッドを実装し、routingも追加する。
anothers_controllerにfacebookメソッドを実装した場合は下記のようにする。
def facebook
hoge
end
get '/auth/facebook_another/callback', to: 'anothers#facebook'
view側の指定は下記。
<%= link_to 'facebookログイン', '/auth/facebook_another' %>
以上で、複数モデルに対してomniauthを使ったFacebook認証・ログインが実装できます。