我使用了devise来允许用户在站点内注册和登录.我还使用omniauth-facebook允许用户使用他们的Facebook帐户登录.但是,首先使用与他们的Facebook电子邮件相同的电子邮件注册的人无法使用他们的Facebook帐户登录.我想同时使用facebook登录和网站注册.
这是我的user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable
def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth.provider, :uid => auth.uid).first
unless user
user = User.create(name:auth.extra.raw_info.name,
provider:auth.provider,
uid:auth.uid,
email:auth.info.email,
password:Devise.friendly_token[0,20]
)
end
user
end
end
和omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
if @user.persisted?
sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
最佳答案 您可以通过以下方式轻松完成此操作:
>使用以下属性创建另一个名为Authorization的模型:
provider:string, uid:string, user_id:integer
>现在,用户将与授权相关联,如下所示:
class User
has_many :authorizations
...
end
>每当发生facebook登录时,请检查授权模型以查看是否存在记录.如果没有创建它并将其链接到用户模型(通过电子邮件ID搜索).
>获取正确的用户对象并使用它进行登录.
资料来源:http://net.tutsplus.com/tutorials/ruby/how-to-use-omniauth-to-authenticate-your-users/