我想让用户使用他们的Facebook ID登录我的网站,而无需重新加载页面。这就是我使用Facebook Javascript SDK的原因。此方案使用此SDK描述授权流程:
在流程结束时,我知道用户已登录,我知道他们的Facebook ID。然后我可以通过此ID在我的数据库中注册它们,然后让它们用它来登录。
然而,这似乎非常不安全。为了让我的服务器端脚本知道用户的ID,我必须通过AJAX发送它。但是,我无法知道是否是该ID的所有者正在尝试登录。任何人都可以发送带有ID的POST请求(特别是一个获取另一个用户的ID)。
我目前的想法是让用户像往常一样通过JS SDK登录,通过AJAX将ID和访问令牌发送到服务器,然后在PHP脚本中使用cURL以确保用户实际登录。
这是顺便说一下,还是我忽略了更好的选择?
答案 0 :(得分:25)
您无需通过ajax推送用户的ID。您应该在服务器端使用保存signed_request的fbsr_ {app_id} cookie。使用FB发出的'secret'app_secret解析此signed_request以获取'user_id'。注意:成功的解析还表明FB提供的cookie数据未被篡改。
解析signed_request后,您还应该获得'issued_at'时间。检查此时间是否在最后10分钟内。通过执行此操作,您知道登录请求会在用户(使用user_id)使用客户端SDK时命中您的服务器。 (参见:http://developers.facebook.com/roadmap/completed-changes/)
您应立即将此代码更换为access_token。如果失败(FB会给你一个OAuthException类型的错误消息),这意味着用户登录到facebook和你收到登录请求之间存在不自然的延迟。
使用步骤#2,您可以使用旧的fbsr_ cookie阻止攻击尝试。如果用户(来自user_id)已经拥有您的帐户,那么您可能希望在此处停止并登录该用户。但是,可能存在app_secret可能遭到入侵的情况。为了处理这种情况,您应该按照步骤#3进行操作,因为代码的access_token只能在问题的10分钟内发生和 。如果用户没有您网站的帐户,那么您无论如何都需要步骤#3来使用access_token从FB中检索其他必要的用户数据,如姓名,电子邮件等。
因此,只有在这10分钟的安全漏洞内,其他人才能偷走受害者的cookie并尝试攻击。如果您对此安全漏洞不满意,则应迁移到服务器端身份验证。决定取决于您存储的用户信息的敏感性。并且您不会妥协任何移动到服务器端身份验证的东西,您可以同时继续使用客户端方法来处理其他事情。
答案 1 :(得分:8)
一旦您通过JS SDK登录用户,将设置一个包含凭据信息的特殊cookie(如果我是正确的话,用您的密钥编码)。然后可以通过PHP SDK getUser()
method使用此信息。
只要您的API(您的ajax端点)与您的应用位于同一个域中,您就应该在用户请求您的服务器时收到此Cookie。
当然,您需要确保正确设置了Javascript SDK并使用了cookie: true
config option,并且您需要valid channel
file。如果不满足这些要求,您可能在IE和Safari中遇到跨域通信和第三方cookie的问题。
您还可以查看以下相关问题:A proper approach to FB auth