【问题标题】:How to securely authorize a user via Facebook's Javascript SDK如何通过 Facebook 的 Javascript SDK 安全地授权用户
【发布时间】:2012-12-20 14:29:12
【问题描述】:

我想让用户使用他们的 Facebook ID 登录我的网站,而无需重新加载页面。这就是我使用Facebook Javascript SDK 的原因。该方案描述了使用此 SDK 的授权流程:

在流程结束时,我知道用户已登录并且我知道他们的 Facebook ID。然后我可以通过这个 ID 在我的数据库中注册他们,然后让他们使用它来登录。

但是,这似乎非常不安全。为了让我的服务器端脚本知道用户的 ID,我必须通过 AJAX 发送它。但是,我无法知道尝试登录的是否是 ID 的所有者。任何人都可以发送带有 ID 的 POST 请求(尤其是获取另一个用户 ID 的人)。

我目前的想法是让用户像往常一样通过 JS SDK 登录,通过 AJAX 将 ID 和 Access Token 发送到服务器,然后在 PHP 脚本中使用 cURL 来确保用户实际登录。

这是要走的路,还是我忽略了更好的选择?

【问题讨论】:

  • 你为什么不把 javascript-sdk 和 php-sdk 结合起来,因为你似乎在使用 php 作为服务器端语言

标签: facebook security authorization facebook-javascript-sdk facebook-login


【解决方案1】:
  1. 您不需要通过 ajax 推送用户 ID。您应该在服务器端使用保存签名请求的 fbsr_{app_id} cookie。使用 FB 发布的“秘密”app_secret 解析此签名请求以获取“用户 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 并尝试进行攻击。如果您对这个安全漏洞不满意,您应该迁移到服务器端身份验证。该决定取决于您存储的用户信息的敏感性。而且您不会损害任何转移到服务器端身份验证的东西,您可以同时继续将客户端方法用于其他事情。

【讨论】:

  • @exizt 我试图澄清一些要点以供您理解。如果这解决了您的问题,您应该接受答案。
  • 我在服务器端使用 java。第一步我应该对图形 API 进行什么调用?
  • 解析cookie是什么意思?如何使用 node.js 或 ASP.net 做到这一点?
  • 对于#1,可以使用getLoginStatus来获取签名请求。
【解决方案2】:

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

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

当然,您需要确保正确设置了 Javascript SDK,并且您使用了cookie: true config option,并且您提供了valid channel file。如果不满足这些要求,您在 IE 和 Safari 中的跨域通信和 3rd 方 cookie 可能会遇到一些问题。

您也可以查看这个相关问题:A proper approach to FB auth

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多