我正在尝试使用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答案)
答案 0 :(得分:2)
考虑到这一点:使用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回复