2

我正在尝试使用 PHP SDK 3.2.2 从 Facebook 检索访问令牌,这是我在 Facebook 成功登录后放置在重定向 URL 中的代码。我的问题是$this->facebook->getAccessToken()在用户授予对 APP 的访问权限后没有返回用户访问令牌,只是一个格式为:'AppId|AppSecret' 的字符串,我必须包含代码手动获取用户访问令牌。这项工作,但我不知道为什么当我使用 getAccessToken 时没有返回正确的令牌。我还想知道是否有比使用 $code 更好的方法来检索用户访问令牌,因为我觉得这不是一个好方法。

注意:我使用 $this->facebook 因为我将它作为 Codeigniter 库加载。

  $access_token  = $this->facebook->getAccessToken();

  //-------------------------------------------------------------------------
  //echo '<br/>Access Token: ' . $access_token;
  // Generare Token if not created:
  $code = $_REQUEST["code"];

  if ( isset($code) ) {
     //echo '<br/>Code Enviado: ' . $code;
     //exit();
     $appId     = $this->facebook->getAppId();
     $appSecret = $this->facebook->getAppSecret();

     $redirectTo = base_url('asociar/acc_facebook/step2/');

     $token_url="https://graph.facebook.com/oauth/access_token?client_id="
        . $appId . "&redirect_uri=" . urlencode($redirectTo)
        . "&client_secret=" . $appSecret
        . "&code=" . $code . "&display=popup";
     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);
     $access_token = $params['access_token'];

     //echo '<br/>Repitiendo el Token';

     $this->facebook->setAccessToken($access_token);
     //echo '<br/>Second Access Token Fijado: ' . $access_token;
  }
  //-----------------------------------------------------------------------

更新:

此问题是由于我将 CI 与 PHP SDK 一起使用(请查看我自己的答案),但该答案对 Facebook PHP SDK 有此问题的任何人都有效(请查看 @Imbru 答案)

4

2 回答 2

2

@Imbru 指出了我的解决方案,如果有任何功劳,请给他。

考虑到这一点:使用 Codeigniter 时,它将所有会话数据保存在 cookie 中并将其发送到浏览器,而不是将其存储在服务器中。是的,他们这样做了,这会导致许多其他问题(例如,当您存储大量数据时会丢失会话,而浏览器只会将其中的一部分发回给您,但那是另一段历史了)。

使用 CI,解决方案是用另一个使用 PHP $_SESSION 管理会话的会话类覆盖会话核心类,例如https://bitbucket.org/xperez/core-session-storage-for-codeigniter(我在我的项目中使用它,并像魅力一样工作)。这样,当使用 PHP-sdk 时,您将保存会话中的值,当 Facebook 类尝试检索它们时,它将能够做到。

当然,如果您在使用 Facebook PHP SDK 时遇到问题,请检查 $_SESSION 是否存储了您想要的值,因为问题是当您想要检索它时服务器中没有该值,导致您到不认证的错误。

于 2014-06-15T08:24:05.183 回答
0

响应有点晚,但可能会对其他用户有所帮助。

我今天也遇到了同样的问题。

我的 access_token 未正确存储在 $_SESSION 中。显然,客户端只发送一次 access_token。您必须将其存储在内存(SESSION)中并重用它。

在正常情况下,Facebook PHP SDK 会这样做......

编辑:有关更多解释,请参阅@Chococroc 回复

于 2014-06-13T14:59:07.657 回答