我使用的是Facebook php和js sdk。
我正在用js sdk登录facebook。登录可以完美地工作。
我有php部分。
private $helper, $api_id, $app_secret, $session;
....
FacebookSession::setDefaultApplication($this->api_id, $this->app_secret);
$this->helper = new FacebookJavaScriptLoginHelper();
try {
$this->session = $this->helper->getSession();
} catch (FacebookRequestException $ex) {
log_message('error', 'Facebook e1 :' . $ex->getCode());
log_message('error', 'Facebook e1 :' . $ex->getMessage());
} catch (\Exception $ex) {
log_message('error', 'Facebook e2 :' . $ex->getCode());
log_message('error', 'Facebook e2 :' . $ex->getMessage());
}
if ($this->session) {
$request = (new FacebookRequest($this->session, 'GET', '/me'))->execute();
$user = $request->getGraphObject()->asArray();
return $user;
} else {
return false;
}
当页面正常加载时,我可以毫无问题地获取用户数据。
但是,例如,如果我多次按f5刷新页面,我会得到错误消息“此授权码已被使用”。或“此授权码已过期。”用户数据为空。
我的想法是使用js登录,并使用php部分来验证用户是否登录到facebook。
我正在使用最新的facebook php sdk:https://github.com/facebook/facebook-php-sdk-v4
谢谢。
发布于 2015-04-11 23:20:04
有几种方法可以解决这个问题。
1)您必须在每次调用时更新cookie中的访问令牌,FB不会自动执行此操作。因此,请确保使用status: true
参数调用FB.init
。
FB.init({
appId : window.fbId,
cookie : true,
status : true,
version : 'v2.3'
});
接下来,无论你是否已经连接到FB.getLoginStatus();
,每次页面刷新都必须调用Facebook。
如果您的应用程序需要执行某些ajax调用,这将不起作用--原因很简单,因为执行ajax时访问令牌不会更新(除非在每次调用ajax之前都调用FB.getLoginStatus();
--这有点过分了)。
2)当用户通过FB JS SDK连接时,最好将访问令牌存储在会话中。PHP代码可能如下所示:
try {
$fbToken = isset($_SESSION['fbToken']) ? $_SESSION['fbToken'] : NULL;
if ($fbToken !== NULL) {
$session = new \Facebook\FacebookSession($fbToken);
} else {
$helper = new FacebookJavaScriptLoginHelper();
$session = $helper->getSession();
}
} catch(\Facebook\FacebookRequestException $ex) {
log_message('error', 'Facebook e1 :' . $ex->getCode());
log_message('error', 'Facebook e1 :' . $ex->getMessage());
} catch(\Exception $ex) {
log_message('error', 'Facebook e2 :' . $ex->getCode());
log_message('error', 'Facebook e2 :' . $ex->getMessage());
}
if ($session) {
$accessToken = $session->getAccessToken();
$longLivedAccessToken = $accessToken->extend();
$_SESSION['fbToken'] = $longLivedAccessToken;
$request = (new FacebookRequest($session, 'GET', '/me'))->execute();
$user = $request->getGraphObject()->asArray();
return $user;
} else {
return FALSE;
}
}
希望我能帮上忙..。干杯。
发布于 2016-11-03 02:15:13
删除您的浏览器历史记录,Cookie这是因为您测试了之前的会话有一些错误的值
https://stackoverflow.com/questions/26074435
复制相似问题