我遇到了同样的问题,我在下面提供了一个解决方案。
我相信发生这种情况的原因是因为在 Javascript 登录尝试中,您的服务器永远不会收到任何访问令牌。 Javascript 仅在您的浏览器和 Facebook.com 之间传递数据,因此您的服务器不知道身份验证状态是什么。您的服务器仅在页面刷新时才会收到新的访问令牌;这是 Facebook 交出访问令牌的地方。
这是我的解决方案。
通过 FB.login 成功登录后,您将收到响应对象,其中包含一个 access_token。您所需要做的就是以某种方式将此访问令牌传递给您的脚本。这是一个例子:
// Hold the access token
var js_access_token = "";
// Connect to facebook
FB.login(function(response) {
if (response.session) {
if (response.perms) {
// user is logged in and granted some permissions.
// Save the access token
js_access_token = response.session.access_token;
// Do stuff on login
}
}
});
然后,您可以将访问令牌与任何请求一起包含在内。我选择了一个ajax示例。
// Communication back to server.
$.ajax({
url: 'myurl.php',
data: {
js_access_token: js_access_token // Including the js_access_token
},
success: function(data) {
console.log(data);
}
});
在你的 PHP 中,你需要有如下所示的东西:
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => TRUE,
));
if ($facebook) {
// If we get the access token from javascript use it instead
if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) {
$facebook->setAccessToken($_REQUEST['js_access_token']);
}
try {
$me = $api->api('/me');
}
catch (Exception $exc) {
// Failure in Safari and IE due to invalid auth token
}
}
希望这可以帮助