LoginSignup
35
32

More than 5 years have passed since last update.

OmniAuthでFacebook認証を複数のモデルで使う

Last updated at Posted at 2015-11-11

はじめに

複数のモデルでのFacebook認証を実装しようとすると、
deviseではうまくいかない(deviseが単一モデルしか対応していない)
ため、deviseから外れた形で実現する必要がある。
日本語の情報が少ないため、覚書として記録しました。

環境

  • ruby 2.2.1
  • rails 4.2.3

前提

devise + omniauth-facebook
を利用してuserモデルのFacebook認証、ログインを実装済みであるところからスタートします。
よくあるこんな形ができてるのが前提です。

userモデルとanotherモデル両方でFacebookログインが可能である形をゴールとします。

実装手順

devise + omniauthableをやめる

まずdeviseの呪縛から開放しましょう。

1.下記の記述を消す。

app/models/user.rb
devise :omniauthable

2.設定記述箇所を変更する

config/initializers/devise.rb
config.omniauth( :facebook,     
         [FACEBOOK_APP_ID],     
         [FACEBOOK_APP_SECRET],     
         scope: 'email', 
         info_fields: 'name, first_name, last_name, email' )

を消して

config/initializers/omniauth.rb
provider :facebook,
   [FACEBOOK_APP_ID],
   [FACEBOOK_APP_SECRET],
   scope: 'email',
   info_fields: 'name, first_name, last_name, email'

に移動する

3.deviseのomniauth_callbacks_controller.rbを使わないようにする

app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    hoge
  end

これを任意のcontrollerに移動し、routingもそれに合わせて書き換える。
users_controllerのfacebookメソッドに移動した場合は下記のようにする。

app/controllers/users_controller.rb
  def facebook
    hoge
  end
config/routes.rb
  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の部分だけオーバーライドします。

lib/omniauth/strategies/facebook_another.rb
module OmniAuth
  module Strategies
    class FacebookAnother < OmniAuth::Strategies::Facebook
      option :name, 'facebook_another'
    end
  end
end

2.設定を追加する
新たに作ったfacebookAPPのIDとSECRETの設定を追加し、先ほど作ったプラグインをrequireで読み込みます。

config/initializers/omniauth.rb
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メソッドを実装した場合は下記のようにする。

app/controllers/anothers_controller.rb
  def facebook
    hoge
  end
config/routes.rb
  get '/auth/facebook_another/callback', to: 'anothers#facebook'

view側の指定は下記。

<%= link_to 'facebookログイン', '/auth/facebook_another' %>

以上で、複数モデルに対してomniauthを使ったFacebook認証・ログインが実装できます。

参考資料

35
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
32