从Facebook获取访问令牌PHP SDK无法正常工作

时间:2013-02-12 16:54:40

标签: facebook codeigniter facebook-php-sdk facebook-access-token

我正在尝试使用PHP SDK 3.2.2从Facebook检索访问令牌,这是我在Facebook中成功用户登录后放置在重定向网址中的代码。我的问题是 $ 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答案)

2 个答案:

答案 0 :(得分:2)

@Imbru在解决方案中指出了我,如果有任何功劳,请将其交给他。

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

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

当然,如果您遇到Facebook PHP SDK的问题,请检查$ _SESSION是否存储了您想要的值,因为问题是当您没有服务器中的值时想要检索它,导致您出现无法身份验证的错误。

答案 1 :(得分:0)

响应时间不多,但可能对其他用户有帮助。

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

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

平时,Facebook PHP SDK会这样做......

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