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

cod*_*iot 7 facebook login facebook-graph-api facebook-javascript-sdk

我已经解决了这个问题,但我的问题不同了.我不确定javascript登录如何确定,以及其他人如何不登录其他帐户.

根据入门 FB.authResponse是在登录成功时调用,但当然在客户端.

然后我们可以得到userIdaccessToken退出响​​应,我们也可以打电话/me获取更多信息.为了将该用户置于会话中,所有关于成功javascript登录的信息必须被发送到服务器,这是我感到困惑的地方.毕竟它是HTTP,每个其他请求都是不同的,可以复制.

可能只是因为我很困惑,关于某人如何不能破解并模仿任何其他用户的脸书ID来登录他的帐户.

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

我敢肯定,我不是第一个有这种困惑的人.请帮助清除这种混乱,因为我现在已多次阅读文档,但仍无法弄清楚为什么其他人无法登录其他人的帐户.

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

cod*_*iot 9

根据 :

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

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

然后在服务器端,必须遵循文档中所述的以下过程进行验证:

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

  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, '-_', '+/'));
}
Run Code Online (Sandbox Code Playgroud)

这将生成一个类似于下面的JSON对象:

{
   "oauth_token": "{user-access-token}",
   "algorithm": "HMAC-SHA256",
   "expires": 1291840400,
   "issued_at": 1291836800,
   "user_id": "218471"
}
Run Code Online (Sandbox Code Playgroud)

获取user_id后,该特定用户可以进入会话,但需要进行其他检查以获得适当的授权.

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

取自这里.

但是,可能存在app_secret可能遭到入侵的情况.为了处理这种情况,您应该遵循步骤#3,因为access_token的代码交换只能发生一次,并且在10分钟内发生.如果用户没有您网站的帐户,那么您无论如何都需要步骤#3使用access_token从FB中检索其他必要的用户数据,如姓名,电子邮件等.

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

GET /oauth/access_token?  
    grant_type=fb_exchange_token&           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={short-lived-token} 
Run Code Online (Sandbox Code Playgroud)

参考