格式错误的Facebook访问令牌

时间:2012-06-21 01:47:42

标签: facebook-graph-api

我正在尝试使用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会一直向我回复此错误。访问令牌很长,我将它作为“文本”字段存储在我的数据库中。我按照他们的指示,现在他们在脚下射击我。任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:63)

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

我相信你(和我)犯的错误是将代码 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'];

More info about fetching an access_token with PHP

More info about using the correct redirect_uri

答案 1 :(得分:3)

一个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'];

答案 2 :(得分:2)

我遇到了同样的问题。弄清楚它是如何工作的,而且对于那些陷入同样泥潭的人来说也是如此。

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());
}

答案 3 :(得分:1)

TL;博士

访问令牌应包含您的应用ID和访问令牌,其中包含管道(|)字符:123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ

创建和使用访问令牌

  

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

创建访问令牌

要求:

  • App id:123456789012345
  • App secret:ZYxwVUTSRqpONMLKjiHGfeDCbA

如果您按照access token creation guide进行操作,您将找到可以创建一个网址的网址:

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

在此示例中,我将关注official facebook guide on sending notifications。他们展示了这个模板:

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

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

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

答案 4 :(得分:0)

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

Laravel Socialite 用户的解决方案:

使用:

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

而不是:

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

答案 5 :(得分:-1)

由于错误显示格式错误,因此格式化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