我想让用户登录使用他们的Facebook ID,而无需重新加载页面我的网站。 这就是为什么我使用的Facebook的Javascript SDK 。 该方案描述了这个SDK授权流程:
在该过程结束时,我知道,用户登录,我知道他们的Facebook ID。 然后我就可以注册他们通过这个ID我的数据库,并让他们用它来以后登录。
然而,这似乎非常不安全的。 为了让我的服务器端脚本知道用户的ID,我必须通过AJAX来发送。 但是,我不知道它是否是谁在试图登录的ID的所有者的方式。任何人都可以发送一个ID(特别是一个得到其他用户的ID的保持)POST请求。
我现在的想法是让用户通过JS SDK像往常一样登录,通过AJAX发送ID和访问令牌服务器,然后使用卷曲的PHP脚本,以确保用户在实际登录。
这是要走的路,还是我俯瞰更好的方法?
你并不需要通过Ajax来推动用户的ID。 你应该在服务器端,使用的持有signed_request的fbsr_ {APP_ID}的cookie。 解析使用您的“秘密”由FB app_secret颁发给获得“USER_ID”这signed_request。 注:一个成功的语法分析也表明,由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。
因此,别人窃取受害者的cookie,并试图攻击只在这10分钟的安全漏洞是可能的。 如果你不满意这个安全漏洞,您应该迁移到服务器端认证。 这一决定取决于你存储用户信息的敏感性。 而你不妥协任何东西转移到服务器端身份验证,可以同时继续使用其他的东西客户端的方法。
一旦你在通过JS SDK用户登录,一个特殊的cookie将包含证书信息(用自己的密钥编码,如果我是正确的)设置。 这个信息然后可以通过使用PHP SDK getUser()
方法 。
只要你的API(你的Ajax终点)是在同一个域中的应用程序,你应该接受这个cookie,每当用户请求的服务器。
当然,你需要确保的Javascript SDK是否设置正确,并且您使用的cookie: true
配置选项 ,而你给一个有效的channel
文件 。 如果这些要求得不到满足,你可能有一些麻烦的跨域通信和在IE和Safari第三方的Cookie。
您还可以检查此相关的问题: 到FB AUTH适当的解决办法