facebook访问令牌仅在一个页面上工作

hem*_*mc4 2 php facebook yii facebook-graph-api facebook-php-sdk

我的应用程序在过去3个月内运行良好,由于Facebook的一些变化,遇到了一个新问题.当我获得访问令牌时:

$facebook->getAccessToken();
Run Code Online (Sandbox Code Playgroud)

它返回一个有效的令牌并获取用户信息.但在另一个页面上,我再次使用相同的函数来获取访问令牌,并获得包括app Id在内的无效访问令牌.我试图获取访问令牌并将其保存到会话并在另一个页面上使用,但它显示异常OAuthException: An active access token must be used to query information about the current user. 但令牌有效,我在这里检查

可能" 2012年12月5日变化 "的原因是什么?我认为我的申请令牌有效期不到一分钟.请帮我.

代码 - >

$facebook = Yii::app()->facebook;
try {
    $facebook_uid = $facebook->getUser(); 

    $accessToken = $facebook->getAccessToken();
    $fbuser = $facebook->api('/me');

 }catch(Exception $e) {

     $access_token = $_SESSION['fb_396582000367255_access_token'];
     $facebook->setAccessToken($access_token);
 }
Run Code Online (Sandbox Code Playgroud)

And*_*rew 5

这是一个错误https://developers.facebook.com/bugs/404450666302585但你可以使用Shawn Carter的工作.如果您确实使用了他的解决方法,则需要阻止Facebook SDK清除会话.这就是你唯一一次上班的原因.这样做的原始和非常脏的方法是修改facebook.php方法以清除所有持久数据.

protected function clearAllPersistentData() {
  return;
  foreach (self::$kSupportedKeys as $key) {
      $this->clearPersistentData($key);
  }
}
Run Code Online (Sandbox Code Playgroud)

除了它为其他人工作(谁没有设置会话),你需要让facebook做一次它的事情.所以我正在做的是:

$tok = $facebook->getAccessToken();

if(strpos($tok, $config["appId"]) == 0 && isset($_SESSION["fb_" . $config["appId"] . "_access_token"]))
{
    $facebook->setAccessToken($_SESSION["fb_" . $config["appId"] . "_access_token"]);
    $tok =$_SESSION["fb_" . $config["appId"] . "_access_token"];
}
Run Code Online (Sandbox Code Playgroud)

请注意,这一切都很脏.由于你已经通过清算会议混淆了水,你还需要自己清理会话以处理其他身份验证情况,例如用户退出,删除然后添加你的应用程序等等......等等您可以在短期内完成此操作,直到他们修复SDK不会将其留在您的代码中.