Rails 3 using Devise:如何允许某人使用他们的 Facebook 帐户登录?
Posted
技术标签:
【中文标题】Rails 3 using Devise:如何允许某人使用他们的 Facebook 帐户登录?【英文标题】:Rails 3 using Devise: How to allow someone to log in using their Facebook account? 【发布时间】:2011-04-04 13:54:09 【问题描述】:我有一个使用 Devise 进行身份验证的 Rails 3 应用程序。现在我需要允许某人使用他们的 Facebook 帐户登录。我认为这称为 Facebook Connect,但我也听说过 Facebook Graph API 这个术语,所以我不确定我要的是哪一个。
为了将 Facebook Connect 与 Devise 集成,我需要做什么?
解决方案:
这个问题现在已经很老了。一年前,Devise v1.2 引入了OmniAuth 支持。现在 Devise 是 v2.1(在撰写本文时),使用 OmniAuth 更加容易。这是来自 using the omniauth-facebook
gem with Devise to allow sign-in using Facebook 上的 Devise wiki 的精彩教程。
还可以在 registering your application and working with the Facebook Graph API 上查看这个很棒的教程。
【问题讨论】:
Devise v1.3 出来了。使用它代替 head 或分支版本 【参考方案1】:这是一个与 Devise + Twitter + Facebook + Linkedin + Google + Github 集成的小应用程序。一站式服务。
你可以找到源代码here 和一个演示here
【讨论】:
【参考方案2】:Devise 1.2 现在带有使用omniauth 的facebook 登录支持,并且可以与Rails 3.0 一起使用。查看wiki entry。
【讨论】:
没有主干/头部版本。新版本的设计出来了。使用 1.3 github.com/plataformatec/devise/tree/v1.3.0 效果很好,谢谢!验证后如何使用 Graph/OpenGraph API?使用其他宝石,例如考拉?【参考方案3】:在我的应用程序中,我使用了omniauth,我认为在回答了这个问题之后就出现了。
https://github.com/intridea/omniauth
【讨论】:
OmniAuth 非常棒,它与 Devise 配合得很好,正如 Railscasts 集(以及以下集)所示:railscasts.com/episodes/235-omniauth-part-1 是的,我下次肯定会使用omniauth。【参考方案4】:刚刚使用 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 解码【讨论】:
【参考方案5】:这个blog post 为我做的。看看吧。
【讨论】:
这是一个很棒的帖子。谢谢你。 该帖子的说明基于设计的未发布版本。 reference【参考方案6】:我检查了设计 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
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
【讨论】:
我认为你是对的。 Facebook 的新身份验证 API 使用 OAuth2。我从未使用过 OAuth、Facebook 和 Devise。所以我可以使用一些额外的帮助。您能否详细说明我需要做什么才能使其与 Facebook 合作? 当然我会试一试,今晚晚些时候我会解决一些问题,并发布一些代码让你继续前进。 谢谢!你的回答很有帮助。 这个答案得分最高,但it's actually out-of-dated。它不再适用于最新版本的设计。请改用omniauth。 @Hugo 我在这里创建了一个完整的应用程序github.com/mohitjain/social-login-in-rails。如果你想用这个 repo 更新你的答案,请告诉我。它集成了所有流行的社交网络,如 facebook、linkedin、google、github、twitter。【参考方案7】:http://github.com/grimen/devise_facebook_connectable
github 上的这个 gem 非常简单。值得一试!
【讨论】:
不适用于 Rails 3:railsplugins.org/plugins/179-devise-facebook-connect以上是关于Rails 3 using Devise:如何允许某人使用他们的 Facebook 帐户登录?的主要内容,如果未能解决你的问题,请参考以下文章
Rails:如何在 Rails 中为 Devise 设置密钥?
每次使用 Rails 3 中的 Devise 登录时,如何检查用户帐户?
Ruby/Rails:您如何自定义 Devise 的邮件模板?
Ruby/Rails:您如何自定义 Devise 的邮件模板?