Ruby-on-rails 使用 Devise 的 Rails 3:如何允许某人使用他们的 Facebook 帐户登录?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3580557/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Rails 3 using Devise: How to allow someone to log in using their Facebook account?
提问by Andrew
I have a Rails 3 application using Devisefor authentication. Now I need to allow someone to log in using their Facebook account. I think this is called Facebook Connect, but I've also heard the term Facebook Graph API, so I'm not sure which one I'm asking for.
我有一个使用Devise进行身份验证的 Rails 3 应用程序。现在我需要允许某人使用他们的 Facebook 帐户登录。我认为这称为 Facebook Connect,但我也听说过 Facebook Graph API 一词,所以我不确定我要的是哪一个。
What do I need to do in order to integrate Facebook Connect with Devise?
我需要做什么才能将 Facebook Connect 与 Devise 集成?
Solution:
解决方案:
This question is pretty old now. A year ago, Devise v1.2 introduced OmniAuthsupport. Now Devise is at v2.1 (as of this writing) and using OmniAuth is even easier. Here is a great tutorial from the Devise wiki on using the omniauth-facebookgem with Devise to allow sign-in using Facebook.
这个问题现在已经很老了。一年前,Devise v1.2 引入了OmniAuth支持。现在 Devise 是 v2.1(在撰写本文时)并且使用 OmniAuth 更加容易。这是来自 Devise wiki 的一个很棒的教程,介绍了如何将omniauth-facebookgem 与 Devise 结合使用以允许使用 Facebook 登录。
Also check out this great tutorial on registering your application and working with the Facebook Graph API.
另请查看有关注册应用程序和使用 Facebook Graph API 的精彩教程。
采纳答案by Yeameen
Devise 1.2 now comes with facebook login support using omniauth and works with Rails 3.0. Check out the wiki entry.
Devise 1.2 现在带有使用 omniauth 的 facebook 登录支持,并与 Rails 3.0 一起使用。查看wiki 条目。
回答by Hugo
I checked the devise github page to see what they were up to. That project is moving pretty fast and as it happens they have support for facebook connect amongst other things. Check out the section on OAuth2. They use github as an example but it would be the same thing for facebook and they mention differences. I think this is the way to go, third party gems for devise don't move as fast as devise or rails do. Cheers.
我检查了设计 github 页面,看看他们在做什么。该项目进展非常快,而且碰巧他们支持 facebook 连接等。查看有关 OAuth2 的部分。他们以 github 为例,但对于 facebook 来说是一样的,他们提到了差异。我认为这是要走的路,devise 的第三方 gem 不像 devise 或 rails 移动得那么快。干杯。
Oops here's the link http://github.com/plataformatec/devise
哎呀这里的链接http://github.com/plataformatec/devise
Edit
编辑
Of course I did very little coding here mostly went with the default, so here goes:
当然,我在这里编写的代码很少,主要使用默认值,所以这里是:
Create a new app and add these gems to the gemfile.
创建一个新应用程序并将这些 gem 添加到 gemfile 中。
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
gem 'oauth2', :git => 'git://github.com/intridea/oauth2.git'
Run bundle install, then these commands gets you going with a basic User authentication model.
运行 bundle install,然后这些命令让您使用基本的用户身份验证模型。
rails generate devise:install
rails generate devise User
In config/initializers/devise.rb uncomment/modify these. Look at the last paragraph as to where you get app_key and secret from facebook.
在 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'
This should be your user model.
这应该是您的用户模型。
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 uses a root :to => "something#here" so I created a home controller with a index action and used that to root the application. But nevermind that. I put that in layout/application.html.erb so that I had basic sign_n sign_out routes.
Devise 使用 root :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 pretty much takes care of everything else for us. What you do need to do though is get your app_key and secret from facebook (used in devise.rb config file). This link should get you going. http://developers.facebook.com/setup
设计几乎为我们处理所有其他事情。您需要做的是从 facebook 获取您的 app_key 和机密(在 devise.rb 配置文件中使用)。这个链接应该让你去。http://developers.facebook.com/setup
回答by alvin
In my app, I use omniauth, which I think came out a bit after this question was answered.
在我的应用程序中,我使用了 omniauth,我认为它是在回答这个问题之后出现的。
回答by Chris
Just used Hugo solution with almost no problem. Here is the User.rb code I had to use :
刚刚使用 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
The things changed in this code :
这段代码中的事情发生了变化:
- name is in attr_accessible (don't forget to add a name field to user)
- changed JSON decoding
- 名称在 attr_accessible 中(不要忘记向用户添加名称字段)
- 改变了 JSON 解码
回答by morcutt
http://github.com/grimen/devise_facebook_connectable
http://github.com/grimen/devise_facebook_connectable
This gem on github is quite straightforward. Worth a shot!
github 上的这个 gem 非常简单。值得一试!

