【发布时间】:2023-03-26 10:13:01
【问题描述】:
在尝试使用 Facebook 登录时,我遇到了这个错误:
图表返回错误:此授权码已被使用。
请建议我该怎么做?我已将所有 app_id 和 app_secret 正确地放入代码中。
config.php
if (!session_id()) {
session_start();
}
require_once('Facebook/autoload.php');
$fb = new Facebook\Facebook([
'app_id' => 'XXXXXXXX', // Replace {app-id} with your app id
'app_secret' => 'XXXXXXXXXX',
'default_graph_version' => 'v3.2',
]);
$helper = $fb->getRedirectLoginHelper();
回调.php
require_once("config.php");
$helper = $fb->getRedirectLoginHelper();
if(isset($_GET['state']))
{
$helper->getPersistentDataHandler()->set('state', $_GET['state']);
}
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (!$accessToken) {
header("Location: ".$siteurl."login.php");
exit;
}
$oAuth2Client = $fb->getOAuth2Client();
if (! $accessToken->isLongLived()) {
$accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
$response = $fb->get("/me?fields=id,email", $accessToken);
$userData = $response->getGraphNode()->asArray();
$_SESSION['userData'] = $userData;
$_SESSION['accessToken'] = (string) $accessToken;
header("Location: ".$siteurl."profile.php");
exit;
}
【问题讨论】:
-
感谢纠正我是新来的。我们会帮我解决我的错误
-
看起来您调用了两次
getRedirectLoginHelper方法。而且您对 state 参数的处理似乎完全错误 - 当您从 Facebook 重定向回您的应用程序时,应该 in 已经在您的会话中,您似乎正在将它 写入那个时候的会话,这完全违背了它的目的。 -
我从 callback.php 文件中删除了 getRedirectLoginHelper。仍然显示相同的错误。如果我没有处理该状态条件,它会给我 Facebook SDK 返回错误:跨站点请求伪造验证失败。持久数据中缺少必需的参数“状态”。错误
-
看起来您一开始就没有正确处理会话。将 session_start 包装到
if (!session_id())没有什么意义 - 如果删除它,然后开始会话。 -
如果条件仍然显示相同的错误,我删除了会话。
标签: php facebook-graph-api facebook-php-sdk