sbi*_*nko 29 security authorization facebook facebook-javascript-sdk facebook-login
我想让用户使用他们的Facebook ID登录我的网站,而无需重新加载页面.这就是我使用Facebook Javascript SDK的原因.此方案使用此SDK描述授权流程:

在流程结束时,我知道用户已登录,我知道他们的Facebook ID.然后我可以通过此ID在我的数据库中注册它们,然后让它们用它来登录.
然而,这似乎非常不安全.为了让我的服务器端脚本知道用户的ID,我必须通过AJAX发送它.但是,我无法知道它是否是ID的所有者谁正在尝试登录.任何人都可以发送带有ID的POST请求(特别是一个获取另一个用户的ID).
我目前的想法是让用户像往常一样通过JS SDK登录,通过AJAX将ID和访问令牌发送到服务器,然后在PHP脚本中使用cURL以确保用户实际登录.
这是要走的路,还是我忽略了更好的选择?
Eth*_*han 26
您不需要通过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并尝试攻击.如果您对此安全漏洞不满意,则应迁移到服务器端身份验证.决定取决于您存储的用户信息的敏感性.并且您不会妥协任何移动到服务器端身份验证的内容,您可以同时继续使用客户端方法来执行其他操作.
一旦您通过JS SDK登录用户,将设置一个包含凭据信息的特殊cookie(如果我是正确的话,用您的密钥编码).然后可以通过PHP SDK getUser()方法使用此信息.
只要您的API(您的ajax端点)与您的应用程序位于同一个域中,您就应该在用户请求您的服务器时收到此cookie.
当然,您需要确保正确设置Javascript SDK并使用cookie: trueconfig选项,并且您需要提供有效channel文件.如果不满足这些要求,您可能在IE和Safari中遇到跨域通信和第三方cookie的问题.
您还可以查看此相关问题:FB身份验证的正确方法
| 归档时间: |
|
| 查看次数: |
5557 次 |
| 最近记录: |