我正在使用Ruby on Rails开发一个Web应用程序。我正在使用authlogic进行身份验证。我的网站有自己的登录,但我希望也使用Facebook。我尝试了authlogic_facebook_connect(使用Facebooker)。经过很多打嗝(文档还没有完全保持完整),我确实让authlogic_facebook_connect工作,没关系。当我面对之前从未使用过网站的用户时,默认的“连接”行为非常有效,但是对于使用Facebook和我的网站使用不同电子邮件地址的人来说,这会导致大量重复登录。这就是我想要的:
当用户点击Facebook“连接”按钮时(并且在他们通过点击“允许”的Facebook验证步骤之后),我想要弹出一个框询问用户是否要连接到预先存在的我的网站上的帐户,或者他们想要为他们自动生成帐户。
如果他们想要为他们自动生成,我们很好,我们会照常进行,但如果 - 另一方面 - 他们想将他们的Facebook帐户链接到我网站上的帐户,我实际上想要他们输入他们的本地凭据并找到正确的帐户。换句话说,我不希望我的解决方案能够自动确定哪个帐户看起来是正确的,我希望用户这样做。
是否有任何宝石/插件/快速黑客可以让我使用authlogic_facebook_connect或OAuth或其他东西来解决这个问题?
- 大卫
答案 0 :(得分:3)
其他人可能会为你指出完美的宝石,但我可以告诉你,我已经解决了类似的问题,根据oauth2宝石推出我们自己的工作并不多。
这是我使用的代码/流程的草图。
1)用户点击“连接到Facebook”,这会向您发送此类操作
def to_facebook
options = {
:redirect_uri => facebook_callback_url,
:scope => "email,publish_stream" # whatever you want to do
}
client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)
redirect_to client.web_server.authorize_url(options)
end
2)用户转到Facebook并为您提供所需的所有访问权限,然后Facebook会调用您指定的回调facebook_callback_url
,这会引导您执行以下操作:
def facebook_callback
client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)
access_token = client.web_server.get_access_token(params[:code], :redirect_uri => facebook_callback_url)
do_my_custom_user_association(access_token)
end
然后你可以在do_my_custom_user_association
中指定你想要的任何内容,如果有人登录,你应该从authlogic获得current_user
,这样你就可以重定向到允许登录用户选择的流程。他们想要合并到他们的当前帐户或不同的帐户。如果没有当前用户,您可以将它们发送到创建帐户流程,并附上一些Facebook数据。
请注意,这只是一个草图,有一些错误案例需要处理(例如,如果error_reason
失败,将使用参数get_acccess_token
来点击facebook_callback)并且我不建议您执行所有操作你的控制器中有oauth2交互,但基本的想法就在那里。
如果任何oauth2互动没有意义,请参阅http://developers.facebook.com/docs/authentication/。