我已经完成了这个 question ,但我的问题是不同的。我不确定 javascript 登录如何确定以及其他人如何无法登录到其他帐户。
根据getting started FB.authResponse
在登录成功时调用,当然是在客户端。
然后我们可以从响应中获取userId
和accessToken
,我们也可以调用/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中所述的以下程序必须遵循验证:
捕获签名请求后,您需要执行三个步骤:
- 将已签名的请求分成两部分,用“.”划定。字符(例如 238fsdfsd.oijdoifjsidf899)
- 从 base64url 解码第一部分 - 编码签名
- 从 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}
关于facebook - 使用 Facebook Javascript SDK 时如何验证用户登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21294534/