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

问题描述:

我试图从Facebook使用PHP SDK 3.2.2检索访问令牌,下面的代码是我在Facebook中的成功用户登录后放置在重定向URL中的代码。我的问题是,在用户授予APP访问权限后,用户访问令牌不会返回用户访问令牌,而只是一种形式为'AppId | AppSecret'的字符串,我必须包括手动获取用户访问令牌的代码。这项工作,但我不知道为什么当我使用getAccessToken不回馈正确的令牌。我还想知道如果有更好的方法来检索用户访问令牌比用$ code,因为我不觉得这是一个很好的方法。从Facebook获取访问令牌PHP SDK无法正常工作

注意:我使用$ 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; 
    } 
    //----------------------------------------------------------------------- 

UPDATE:

这个问题是由于我使用的CI与PHP SDK(检查我自己的这个答案),但得到的答复是有效的(任何人都具有与Facebook PHP SDK这个问题,检查@Imbru回答)

这个回应有点迟,但可能会对其他用户有所帮助。

今天我有同样的问题。

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

在正常时间,Facebook的PHP SDK做...

编辑:见更多的解释

+1

嗨!我已经将你的答案标记为已接受,因为尽管我没有检查过,但我确定你是对的。 Codeigniter不使用PHP NATIVE SESSIONS,它发送cookie中的所有数据,因此,当Facebook SDK尝试在SESSION中保存令牌的值时,它不能。 – Chococroc 2014-06-15 08:12:06

@Imbru指出我的解决方案@Chococroc响应,如果有信用,给他。

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

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

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