facebook - 使用 Facebook Javascript SDK 时如何验证用户登录

标签 facebook facebook-graph-api authentication facebook-javascript-sdk

我已经完成了这个 question ,但我的问题是不同的。我不确定 javascript 登录如何确定以及其他人如何无法登录到其他帐户。

根据getting started FB.authResponse 在登录成功时调用,当然是在客户端。

然后我们可以从响应中获取userIdaccessToken,我们也可以调用/me获取更多信息。为了让该用户进入 session ,所有关于成功登录 javascript 的信息都必须发送到服务器,这就是我感到困惑的地方。 毕竟它是 HTTP,每个其他请求都是不同的并且可以复制。

可能只是我很困惑,有人无法破解和模仿任何其他用户的 facebook id 来登录他的帐户。

例如身份验证成功后,我对我的服务器进行 ajax 调用,提供 fb-user-id 然后我将它与数据库匹配并将适当的用户放入 session 中,但不是因为这是 fb-user-id 没有在后端再次验证(或者它是否已验证?,我虽然没有发现任何相关信息)这个特定用户是实际在我的应用程序中注册的用户,然后可以使用其他人的 fb-user-id 发出相同的登录请求以登录他的帐户。

我敢肯定,我不是第一个有这种困惑的人。请帮助消除这种困惑,因为我已经阅读了很多次文档,但仍然无法弄清楚为什么其他人无法登录到其他人的帐户。

编辑 我找到了这个 similar question但是这里的人没有回答他是如何验证后端登录的,或者可能是我无法理解。

最佳答案

根据:

How to securely authorize a user via Facebook's Javascript SDK

将 signed_request 字段发送到您的服务器,该字段正在使用 javascript sdk 在 authResponse 中接收

然后在服务器端,按照documentation中所述的以下程序必须遵循验证:

捕获签名请求后,您需要执行三个步骤:

  1. 将已签名的请求分成两部分,用“.”划定。字符(例如 238fsdfsd.oijdoifjsidf899)
  2. 从 base64url 解码第一部分 - 编码签名
  3. 从 base64url 解码第二部分 - “有效负载”,然后解码生成的 JSON 对象

这是一个 PHP 示例:

function parse_signed_request($signed_request) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  $secret = "appsecret"; // Use your app secret here

  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  // confirm the signature
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}

这将生成一个如下所示的 JSON 对象:

{
   "oauth_token": "{user-access-token}",
   "algorithm": "HMAC-SHA256",
   "expires": 1291840400,
   "issued_at": 1291836800,
   "user_id": "218471"
}

获得 user_id 后,可以将该特定用户置于 session 中,尽管需要进行其他检查以确保正确授权。

作为第二次检查,可以检查 issued_at 是否不超过 10 分钟。

取自here .

However, there may be scenarios where your app_secret may be compromised. To take care of this case, you should follow step #3, as the exchange of code for access_token can happen only once and within 10 mins of it's issue. If the user doesn't have an account with your site, then you anyway need step #3 to use the access_token for retrieving other necessary user data, like name, email, etc from FB.

为了刷新 token ,可以从您的服务器进行以下调用

GET /oauth/access_token?  
    grant_type=fb_exchange_token&           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={short-lived-token} 

Reference

关于facebook - 使用 Facebook Javascript SDK 时如何验证用户登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21294534/

相关文章:

facebook - 远程链接到 FB 个人资料图片还是本地存储?

ios - Facebook iOS SDK 错误 – 发布开放图谱操作

java - 使用自定义 JAAS 登录模块启动 JMX 代理,将 login() 设置为始终返回 true

java - 使用 HttpClient 4.0.1 使用 x509 证书进行相互身份验证

facebook - 用户如何评价 Facebook Connect 网站?

facebook - 需要在单个 Facebook 应用程序中添加多个域

iOS Facebook FQL 问题

facebook - Facebook Canvas 应用程序是否需要登录按钮?

java - 加密属性文件中的值

c# - 如何确定 Facebook 用户是否登录到 Facebook 从 C# 连接