Facebook访问令牌和AJAX调用
我有一个应用程序,我最初编码为PHP中的服务器端身份验证。
不过,我希望客户端能够在我的服务器中执行AJAX调用,然后基于Facebook用户ID在我的数据库中执行一些查询。 我不能接受一个userId变量,因为任何人都可以欺骗它,所以我认为我需要访问用户的accessToken。
但是,这是对服务器上的PHP文件的AJAX调用,因此我无法使用与示例中介绍的相同的服务器端身份验证方法。
所以我认为客户端需要通过AJAX调用传递FB访问令牌,然后验证访问令牌服务器端,然后使用它来获取用户的ID和附加信息。
但是,如果我使用服务器端身份验证,则客户端永远不会从Facebook中检索其访问令牌,只有服务器拥有它,这意味着客户端无法传递访问令牌。
我的问题是:一旦我做了原始的服务器端验证,我应该根据cookie存储访问令牌服务器端,然后以这种方式获取access_token?
或者,Facebook应用程序是否有更好的做法,以便我不需要担心通过cookie欺骗泄露访问令牌?
首先,您不应该将访问令牌存储在cookie中或通过ajax调用发送它。 访问令牌是一个必须始终不可见的合理数据。
我不知道这是否是最好的方法,但我总是使用signedRequest。 这是一个安全的数据发送到你的服务器,因为它是用你的应用秘密进行加密的,没人知道......
如果您将signedRequest(从FB JS SDK)传递到您的服务器,则可以检索有效的访问令牌。 在PHP中,它看起来像这样,假设您通过POST传递signedRequest:
$signed_request = $_POST['signedRequest'];
$data = parseSignedRequest($signed_request);
$token_url= 'https://graph.facebook.com/oauth/access_token?' .
'client_id=' . YOUR_APP_ID .
'&redirect_uri=' . // when using the JS signedRequest, leave this blank
'&client_secret=' . YOUR_APP_SECRET .
'&code=' . $data["code"];
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $params['access_token']; // here is your access token
您将需要这些功能:
function parseSignedRequest($signed_request) {
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
// decode the data
$sig = base64UrlDecode($encoded_sig);
$data = json_decode(base64UrlDecode($payload), true);
if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
return 'Unknown algorithm. Expected HMAC-SHA256';
}
// check sig
$expected_sig = hash_hmac('sha256', $payload, YOUR_APP_SECRET, $raw = true);
if ($sig !== $expected_sig) {
return 'Bad Signed JSON signature!';
}
return $data;
}
function base64UrlDecode($input) {
return base64_decode(strtr($input, '-_', '+/'));
}
当然,如果您将访问令牌存储在您的数据库中,则无需通过此操作,但请注意令牌过期。
如果用户已经授权您的应用并登录Facevook,您可以从cookie $_COOKIE[('fbsr_' . YOUR_APP_ID)]
检索signedRequest,但我对这些数据不太信任......