(Rails) Devise+OmniAuthでfacebook認証

gemのインストール

以下のgemをGemfileに足して、bundle install

<br />
# Gemfile</p>
<p>gem 'devise'<br />
gem 'omniauth-facebook'<br />

Deviseの設定

<br />
rails g devise:install<br />

config/initializers/devise.rbを全部コメントアウトして次のようにする。

 # config/initializers/devise.rb</p>
<p>Devise.setup do |config|<br />
  require 'devise/orm/active_record'<br />
  if Rails.env.production?<br />
    config.omniauth :facebook, 'APP_ID1', 'APP_SECRET1', :scope=&gt;'email,read_stream'<br />
  else<br />
    config.omniauth :facebook, 'APP_ID2', 'APP_SECRET2', :scope=&gt;'email,read_stream'<br />
  end<br />
  config.sign_out_via = :get<br />
end<br />

APP_IDとAPP_SECRETはhttps://developers.facebook.com/apps/から取得。
通常、productionとdevelopmentで別々のアプリを用意しておくと良い。

その後、Userモデルを作成

<br />
rails g devise user<br />
rails g migration AddColumnsToUsers provider:string uid:string name:string<br />

Userモデルの修正

次のようにUserモデルを記述

<br />
# app/models/user.rb</p>
<p>class User &lt; ActiveRecord::Base<br />
  devise :omniauthable, :database_authenticatable, :trackable<br />
  attr_accessible :provider, :uid, :name, :email, :password</p>
<p>  def self.find_for_facebook_oauth(auth, signed_in_resource=nil)<br />
    user = User.where(:provider =&gt; auth.provider, :uid =&gt; auth.uid).first<br />
    unless user<br />
      user = User.create(<br />
        name:auth.extra.raw_info.name,<br />
        provider:auth.provider,<br />
        uid:auth.uid,<br />
        email:auth.info.email,<br />
        password:Devise.friendly_token[0,20]<br />
      )<br />
    end<br />
    user<br />
  end<br />
end<br />

ログインページの作成

<br />
rails g controller users/sessions new destroy<br />

ログインページを次のようにする。

<br />
# app/views/users/sessions/new.html.erb</p>
<p>&lt;%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %&gt;<br />

コールバックを処理するアクションの作成

<br />
rails g controller users/omniauth_callbacks<br />

次のように変更 Devise::OmniauthCallbacksControllerの派生になってることに注意

<br />
# app/controllers/users/omniauth_callbacks_controller.rb<br />
class Users::OmniauthCallbacksController &lt; Devise::OmniauthCallbacksController<br />
  def facebook<br />
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)<br />
    if @user.persisted?<br />
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind =&gt; "Facebook"<br />
      sign_in_and_redirect @user, :event =&gt; :authentication<br />
    else<br />
      session["devise.facebook_data"] = request.env["omniauth.auth"]<br />
      redirect_to new_user_registration_url<br />
    end<br />
  end<br />
end<br />

routes.rbから、OmniAuth以外のルートをブロック

<br />
# config/routes.rb</p>
<p># get "sessions/new"<br />
# get "sessions/destroy"<br />
# get "devise_for :users"<br />
devise_for :users, :controllers=&gt;{:omniauth_callbacks=&gt;"users/omniauth_callbacks"}, :skip=&gt;[:sessions]<br />
devise_scope :user do<br />
  get 'sign_in', :to =&gt; 'users/sessions#new', :as =&gt; :new_user_session<br />
  get 'sign_out', :to =&gt; 'devise/sessions#destroy', :as =&gt; :destroy_user_session<br />
end<br />

補足

開発用のFacebookのアプリはWebsite with Facebook Loginをチェックして、次のようにする。
Basic Facebook Developers

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です