2011-11-28 79 views
0

我遵循Ryan的关于Omniauth here的说明。注册用户首次使用Facebook登录 - Omniauth

但是,有一个情况,瑞安没有涵盖: 用户已经有一个帐户,但他们第一次登录Facebook/Linkedin。在这种情况下,我希望用户使用传统登录(通过Devise)进行登录,如果成功,请为将来的登录创建一个新的身份验证对象。

特别是,当注册用户第一次点击“Signin with Facebook”时,我会从包含他的Facebook帐户信息的回调中获得散列。但我不想为他创建一个身份验证。相反,我会将他重定向到我的Devise登录页面,允许他输入用户名和密码。如果他成功登录,我想从我从Facebook回调获得的信息中创建一个新的Authentication对象。

在用户登录成功之前,暂时存储Facebook哈希值的好方法是什么?

谢谢。

下面是从AuthenticationController.rb,瑞安创建的代码,它没有处理我刚才所说的情况:

def create 
    omniauth = request.env["omniauth.auth"] 

authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid']) 
if authentication 
    flash[:notice] = "Signed in successfully." 
    sign_in_and_redirect(:user, authentication.user) 
elsif current_user 
    current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) 
    flash[:notice] = "Authentication successful." 
    redirect_to authentications_url 
else 
    user = User.new 
    user.apply_omniauth(omniauth) 
    if user.save 
    flash[:notice] = "Signed in successfully." 
    sign_in_and_redirect(:user, user) 
    else 
    session[:omniauth] = omniauth 
    redirect_to new_user_registration_url 
    end 
end 

回答

0

而不是做这个的,你能不能只检查是否有另一位用户在用Facebook注册时使用相同的电子邮件?如果是这样,请添加Facebook作为第二种身份验证方法,如果没有,请创建一个新帐户。

相关问题