65

我有一个使用Devise进行身份验证的 Rails 3 应用程序。现在我需要允许某人使用他们的 Facebook 帐户登录。我认为这称为 Facebook Connect,但我也听说过 Facebook Graph API 这个术语,所以我不确定我要的是哪一个。

为了将 Facebook Connect 与 Devise 集成,我需要做什么?

解决方案:

这个问题现在已经很老了。一年前,Devise v1.2 引入了OmniAuth支持。现在 Devise 是 v2.1(在撰写本文时),使用 OmniAuth 更加容易。这是来自 Devise wiki 的一个很棒的教程,关于omniauth-facebookgem 与 Devise 一起使用以允许使用 Facebook 登录

另请查看有关注册应用程序和使用 Facebook Graph API 的精彩教程。

4

7 回答 7

54

我检查了设计 github 页面,看看他们在做什么。该项目进展得非常快,而且碰巧他们支持 facebook connect 等等。查看有关 OAuth2 的部分。他们以 github 为例,但对于 facebook 来说也是一样的,他们提到了差异。我认为这是要走的路,用于设计的第三方宝石不会像设计或导轨那样快速移动。干杯。

糟糕,这是链接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'

运行 bundle install,然后这些命令让您使用基本的用户身份验证模型。

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

设计使用一个根 :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>

设计几乎可以为我们处理其他所有事情。不过,您需要做的是从 facebook 获取您的 app_key 和 secret(在 devise.rb 配置文件中使用)。这个链接应该让你去。http://developers.facebook.com/setup

于 2010-08-31T15:41:40.293 回答
21

Devise 1.2 现在带有使用omniauth 的facebook 登录支持,并且可以与Rails 3.0 一起使用。查看wiki 条目

于 2011-03-16T05:09:52.877 回答
8

在我的应用程序中,我使用了omniauth,我认为在回答了这个问题之后才出现了一点。

https://github.com/intridea/omniauth

于 2010-12-10T17:50:42.730 回答
6

这篇博文为我做了。给它看看。

于 2010-09-03T01:03:28.627 回答
6

刚刚使用 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 解码
于 2010-09-09T21:25:42.013 回答
3

http://github.com/grimen/devise_facebook_connectable

github 上的这个 gem 非常简单。值得一试!

于 2010-08-28T00:30:50.357 回答
1

这是一个与 Devise + Twitter + Facebook + Linkedin + Google + Github 集成的小应用程序。都在一个地方。

你可以在这里找到源代码和演示在这里

于 2013-10-27T14:57:24.203 回答