web-dev-qa-db-ja.com

Rails 3 Deviseを使用:Facebookアカウントを使用して誰かがログインできるようにする方法は?

Rails 3アプリケーションを使用して、認証に Devise を使用しています。今度は、Facebookアカウントを使用してログインを許可する必要があります。 Facebook Graph APIという言葉も聞いたことがあるので、どちらを求めているのかわかりません。

Facebook ConnectとDeviseを統合するには、何をする必要がありますか?

溶液:

この質問はかなり古いです。 1年前、Devise v1.2は OmniAuth サポートを導入しました。 Deviseはv2.1(この記事の執筆時点)であり、OmniAuthの使用はさらに簡単です。 Facebookを使用したサインインを許可するためにDeviseでomniauth-facebook gemを使用 のDevise wikiからの素晴らしいチュートリアルです。

アプリケーションの登録とFacebook Graph APIの操作 に関するこの素晴らしいチュートリアルもご覧ください。

65
Andrew

Devise 1.2にはomniauthを使用したfacebookログインサポートが付属し、Rails 3.0。 wikiエントリ を確認してください。

21
Yeameen

Devise githubページをチェックして、彼らが何をしていたかを確認しました。このプロジェクトは非常に高速に進行しており、たまたま、Facebook Connectをサポートしています。 OAuth2のセクションをご覧ください。彼らはgithubを例として使用していますが、facebookでも同じことであり、違いに言及しています。これが進むべき道だと思う、deviseのためのサードパーティの宝石はdeviseやRails do。乾杯。

リンクがあります http://github.com/plataformatec/devise

編集

もちろん、ここではほとんどコーディングしていませんでしたが、ほとんどがデフォルトで行われたため、次のようになります。

新しいアプリを作成し、これらのgemをgemfileに追加します。

gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
gem 'oauth2', :git => 'git://github.com/intridea/oauth2.git'

バンドルインストールを実行すると、これらのコマンドで基本的なユーザー認証モデルを使用できます。

Rails generate devise:install
Rails generate devise User

Config/initializers/devise.rbでこれらのコメントを解除/変更します。 Facebookからapp_keyとsecretを取得する場所に関する最後の段落を見てください。

config.oauth :facebook, 'app_key', 'secret',
    :site              => 'https://graph.facebook.com',
    :authorize_path    => '/oauth/authorize',
    :access_token_path => '/oauth/access_token'

これがユーザーモデルになります。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable, :timeoutable and :oauthable
  devise :database_authenticatable, :oauthable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    # Get the user email info from Facebook for sign up
    # You'll have to figure this part out from the json you get back
    data = ActiveSupport::JSON.decode(access_token)

    if user = User.find_by_email(data["email"])
      user
    else
      # Create an user with a stub password.
      User.create!(:name => data["name"], :email => data["email"], :password => Devise.friendly_token)
    end
  end
end

Deviseはルート:to => "something#here"を使用するので、インデックスアクションを持つホームコントローラーを作成し、それを使用してアプリケーションをルート化します。しかし、決して気にしないでください。これをlayout/application.html.erbに配置して、基本的なsign_n sign_outルートを用意しました。

<span>
  <%- if user_signed_in? %>
    <%= "Signed in as #{current_user.full_name}. Not you?" %>
    <%= link_to 'Sign out', destroy_user_session_path %>
  <%- else %>
    <%= link_to 'Sign in', new_user_session_path %>
  <%- end %>
</span>

Deviseが他のすべての面倒を見てくれます。ただし、必要なのは、facebookからapp_keyとsecretを取得することです(devise.rb構成ファイルで使用)。このリンクはあなたを元気づけるはずです。 http://developers.facebook.com/setup

54
Hugo

私のアプリではomniauthを使用していますが、これはこの質問に答えた後少し出てきたと思います。

https://github.com/intridea/omniauth

8
alvin

Hugoソリューションを使用したところ、ほとんど問題はありませんでした。ここに私が使用しなければならなかったUser.rbコードがあります:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable, :timeoutable and :oauthable
  devise :database_authenticatable, :oauthable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    # Get the user email info from Facebook for sign up
    # You'll have to figure this part out from the json you get back

    data = ActiveSupport::JSON.decode(access_token.get('https://graph.facebook.com/me?'))

    logger.info("received from Facebook: #{data.inspect}")

    if user = User.find_by_email(data["email"])
      user
    else
      # Create an user with a stub password.
      User.create!(:name => data["name"], :email => data["email"], :password => Devise.friendly_token)
    end
  end
end

このコードの変更点:

  • 名前はattr_accessibleにあります(名前フィールドをユーザーに追加することを忘れないでください)
  • jSONデコードの変更
6
Chris

これは ブログ投稿 でした。それを見てください。

6
mikewilliamson

http://github.com/grimen/devise_facebook_connectable

Githubのこのgemは非常に簡単です。試してみる価値!

3
morcutt

Devise + Twitter + Facebook + Linkedin + Google + Githubと統合した小さなアプリケーションを次に示します。一箇所にすべて。

ソース here およびデモ here を見つけることができます

1
Mohit Jain