如何通过Facebook的Javascript SDK安全地授权用户

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

  1. 您不需要通过ajax推送用户的ID.您应该在服务器端使用保存signed_request的fbsr_ {app_id} cookie.使用FB发出的'secret'app_secret解析此signed_request以获取'user_id'.注意:成功的解析还表明FB提供的cookie数据未被篡改.

  2. 解析signed_request后,您还应该获得'issued_at'时间.检查此时间是否在最后10分钟内.通过执行此操作,您知道登录请求会在用户(使用user_id)使用客户端SDK时命中您的服务器.(参见:http://developers.facebook.com/roadmap/completed-changes/)

  3. 您应立即将此代码替换为access_token.如果失败(FB将给出类型为OAuthException的错误消息),则表示用户登录到facebook并获得登录请求之间存在不自然的延迟.

使用步骤#2,您可以使用旧的fbsr_ cookie阻止攻击尝试.如果用户(来自user_id)已经拥有您的帐户,那么您可能希望在此处停止并登录该用户.但是,可能存在app_secret可能遭到入侵的情况.为了处理这种情况,您应该遵循步骤#3,因为access_token的代码交换只能发生一次,并且在10分钟内发生.如果用户没有您网站的帐户,那么您无论如何都需要步骤#3使用access_token从FB中检索其他必要的用户数据,如姓名,电子邮件等.

因此,只有在这10分钟的安全漏洞内,才有可能窃取受害者的cookie并尝试攻击.如果您对此安全漏洞不满意,则应迁移到服务器端身份验证.决定取决于您存储的用户信息的敏感性.并且您不会妥协任何移动到服务器端身份验证的内容,您可以同时继续使用客户端方法来执行其他操作.


Sim*_*ias 8

一旦您通过JS SDK登录用户,将设置一个包含凭据信息的特殊cookie(如果我是正确的话,用您的密钥编码).然后可以通过PHP SDK getUser()方法使用此信息.

只要您的API(您的ajax端点)与您的应用程序位于同一个域中,您就应该在用户请求您的服务器时收到此cookie.

当然,您需要确保正确设置Javascript SDK并使用cookie: trueconfig选项,并且您需要提供有效channel文件.如果不满足这些要求,您可能在IE和Safari中遇到跨域通信和第三方cookie的问题.

您还可以查看此相关问题:FB身份验证的正确方法