格式错误的 Facebook 访问令牌



我正在尝试使用Facebook Graph API从Facebook获取相册并将它们放在我正在开发的网站上。我正在使用PHP作为Codeigniter框架的语言,并重定向到Facebook URL以获取用户的访问令牌。Facebook向我返回了一个访问令牌,我抓住它并将其插入我的数据库中。

话虽如此,当我尝试通过转到图形 URL 来获取相册的 JSON 数据时,它会返回错误。图形 URL 和错误是:

https://graph.facebook.com/1298926000574/photos?access_token=[MY ACCESS TOKEN]
My access token: AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg
Returned error:
{
"error": {
  "message": "Malformed access token [MY ACCESS TOKEN]",
  "type": "OAuthException",
  "code": 190
}
} 

真的不确定为什么Facebook一直向我返回此错误。访问令牌很长,我将其作为"文本"字段存储在数据库中。我听从了他们的指示,现在他们正在搬起石头砸我的脚。任何帮助将不胜感激。

我遇到了同样的问题,我发现这篇文章正在寻找解决方案。我注意到"我们的"访问令牌有很多奇怪的符号,而其他符号只是一个字母数字字符串。

我相信你(和我)犯的错误是将代码access_token混合在一起

将Facebook用户发送到您的API以确认访问权限后,他们将返回您的网站,并带有$_GET['code']。此代码需要与Facebook进行验证,Facebook将在成功时返回access_token

$app_id = [YOUR_APP_ID];
$app_secret = [YOUR_APP_SECRET];
$my_url = [THE_SAME_AS_THE_POST_BEFORE];
$code = $_GET['code'];
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
json_decode($response, $params);
$access_token = $params['access_token'];

有关使用 PHP 获取access_token的更多信息

有关使用正确redirect_uri的详细信息

一个 wp 插件返回相同的错误,这就是解决方案,它可能与您的问题有关:

Php请求access_token,Facebook服务器返回它。

返回的包含 access_token USED 的消息如下所示:

access_token=.......

但是对于新创建的应用程序(2012年),Facebook服务器返回:

access_token=.....&expires=.....

如果您的代码解析错误,如

$access_token=str_replace('access_token=','',$message);

然后你的 $access_token 错误地包含额外的 &expires 等。

它应该像这样解析:

parse_str($message,$ar); $access_token=$ar['access_token'];

我遇到了同样的问题。弄清楚它是如何工作的,这里适合任何陷入同样泥潭的人。

require 'facebook-php-sdk/facebook.php';
$facebook = new Facebook(array(
  'appId'  => 'APP ID',
  'secret' => 'SECRET KEY',
));
// Get User ID
$user = $facebook->getUser();  
if ($user) {
    $accessToken = $facebook->getAccessToken();
        try {
            $url = "https://graph.facebook.com/1298926000574/photos?access_token=".$accessToken;
            $photos = $facebook->api($url);
            var_dump($photos);
        } catch (FacebookApiException $e) {
            $user = null;
        }
    }   
} else {
    //echo "You need to login";
    header("Location:".$facebook->getLoginUrl());
}

您在请求中发送code而不是access_token

Laravel社交名流用户的解决方案:

用:

$response = Socialite::driver($provider)->getAccessTokenResponse($request['code']);
$user = Socialite::driver($provider)->userFromToken($response['access_token']);

而不是:

$user = Socialite::driver($provider)->user();

tl;dr

访问令牌应由您的应用程序 ID 和访问令牌组成,它们之间有一个管道 (| ) 字符:123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ

创建和使用访问令牌

注意:在本教程中,我仅使用虚拟凭据。它们的样式将与真实样式相同,但它们的确切值只是一系列递增的数字或字符。切勿在线发布您的实际凭据!

创建访问令牌

要求:

  • 应用 ID:123456789012345
  • 应用机密:ZYxwVUTSRqpONMLKjiHGfeDCbA

如果您遵循访问令牌创建指南,您将找到此 URL,您可以在其中创建一个:

GET /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials

如果我们插入虚拟凭据,GET 请求的 URI 应如下所示:

 http://graph.facebook.com/oauth/access_token?client_id=123456789012345&client_secret=ZYxwVUTSRqpONMLKjiHGfeDCbA&grant_type=client_credentials

响应将是:

{
  "access_token": "123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ",
  "token_type": "bearer"
}

访问令牌由应用 ID 后跟管道 ( | ) 组成,然后是可称为实际访问令牌的字符串。

使用访问令牌

要求:

  • 访问令牌:123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ
  • 无论您需要什么其他凭据。此示例中的用户 ID:1234567890

在此示例中,我将遵循有关发送通知的官方Facebook指南。他们展示了这个模板:

POST /{recipient_userid}/notifications?access_token=... &template=...&href=...

这意味着,在您填写凭据后,示例 POST 请求应如下所示:

http://graph.facebook.com/1234567890/notifications?access_token=123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ&template=Test&ref=notif_test

由于错误说它的格式不正确的异常意味着格式化request时出错。

https://graph.facebook.com/me/photos/?access_token=[your_accesstoken]

所以它会像

https://graph.facebook.com/me/photos/?access_token=AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg

最新更新