2

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

$facebook->getAccessToken();

它返回一个有效的令牌并获取用户信息。但是在另一个页面上,我再次使用相同的函数来获取访问令牌,并且我得到了无效的访问令牌,包括应用程序 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);
 }
4

3 回答 3

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);
  }
}

除了让它为其他人工作(谁的会话没有设置),你需要允许 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"];
}

请注意,这一切都很肮脏。由于您已经用清除会话的事情弄混了水,您还需要自己清除会话以处理其他身份验证情况,例如用户注销、删除然后重新添加您的应用程序等......等等......所以虽然在他们修复 SDK 之前,您可以在短期内执行此操作,不要将其留在您的代码中。

于 2012-12-06T17:34:34.917 回答
2

尝试这个。有些事情有点乱,你在 try catch 的 else 开关中设置了令牌。

$facebook = Yii::app()->facebook;
try {
    $facebook_uid = $facebook->getUser(); 
     $access_token = $_SESSION['fb_396582000367255_access_token'];
     $facebook->setAccessToken($access_token);
    //$accessToken = $facebook->getAccessToken();
    $fbuser = $facebook->api('/me');

 }catch(Exception $e) {


 }
于 2012-12-06T16:12:15.307 回答
1

尝试使用 fb sr _396582000367255_access_token 代替 fb_396582000367255_access_token

于 2012-12-06T18:48:54.133 回答