如果您在通过 Javascript API 调用 FB.init() 时将 oauth 设置为 true,您现在将获得 fbsr_APP_ID cookie 而不是 fbs_APP_ID cookie(注意“r”)。它包含签名的请求和 oauth 迁移的一部分。
如果您使用 PHP SDK,它应该会处理更改。
然而,网站的文档似乎没有使用新的 get_facebook_cookie() 函数进行更新:https://developers.facebook.com/docs/guides/web/ https://developers.facebook.com/docs/guides/web/
它仍然使用旧的 cookie 格式。您可以在此处找到如何解析签名请求:
http://developers.facebook.com/docs/authentication/signed_request/ http://developers.facebook.com/docs/authentication/signed_request/
然后,您需要通过此处的文档将 cookie 中的“code”参数转换为 access_token:
developers.facebook.com/docs/authentication/(没有 http://,因为 StackOverflow 垃圾邮件防护)
我在新的 PHP SDK 的源代码中进行了一些研究,以解决这个问题,因为所有文档似乎都没有更新。
我使用的完整代码是上述代码的组合,并进行了一些额外的修改,以使用旧的或新的 cookie 格式,如下所示。新的 get_facebook_cookie() 函数确实返回一些额外的数组元素(algorithm、code、issued_at、user_id),并且不再设置一些数组元素(base_domain、secret、session_key、sig)。大多数人正在寻找的主要参数很可能已设置(uid、access_token 和 expires)
function get_facebook_cookie($app_id, $app_secret) {
if ($_COOKIE['fbsr_' . $app_id] != '') {
return get_new_facebook_cookie($app_id, $app_secret);
} else {
return get_old_facebook_cookie($app_id, $app_secret);
}
}
function get_old_facebook_cookie($app_id, $app_secret) {
$args = array();
parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
ksort($args);
$payload = '';
foreach ($args as $key => $value) {
if ($key != 'sig') {
$payload .= $key . '=' . $value;
}
}
if (md5($payload . $app_secret) != $args['sig']) {
return array();
}
return $args;
}
function get_new_facebook_cookie($app_id, $app_secret) {
$signed_request = parse_signed_request($_COOKIE['fbsr_' . $app_id], $app_secret);
// $signed_request should now have most of the old elements
$signed_request[uid] = $signed_request[user_id]; // for compatibility
if (!is_null($signed_request)) {
// the cookie is valid/signed correctly
// lets change "code" into an "access_token"
$access_token_response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=$app_id&redirect_uri=&client_secret=$app_secret&code=$signed_request[code]");
parse_str($access_token_response);
$signed_request[access_token] = $access_token;
$signed_request[expires] = time() + $expires;
}
return $signed_request;
}