【问题标题】:Malformed Facebook Access Token格式错误的 Facebook 访问令牌
【发布时间】:2012-06-21 01:47:42
【问题描述】:

我正在尝试使用 Facebook Graph API 从 Facebook 获取相册并将它们放置在我正在开发的网站上。我在 Codeigniter 框架中使用 PHP 作为我的语言,并重定向到 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 为何不断向我返回此错误。访问令牌很长,我将它作为“文本”字段存储在我的数据库中。我听从了他们的指示,现在他们正朝我的脚开枪。任何帮助将不胜感激。

【问题讨论】:

  • 方括号里的字是你放的吗?
  • 是的,它只是用来显示访问令牌在 URL 中的位置和错误 JSON
  • 您是否尝试绕过存储在数据库中,而是直接从 Facebook 返回的数据中使用它?我的观点是确保不怪罪于令牌的存储和查询。
  • 那个访问令牌肯定有问题 - 我的似乎都没有下划线或破折号......它是以某种方式编码的吗?
  • 不要公开发布真正的访问令牌!确保您更改了所有访问令牌中的某些字符,并尝试通过在完成此问题后立即注销并重新登录来使它们无效!

标签: facebook-graph-api


【解决方案1】:

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

我认为您(和我)所犯的错误是将 codeaccess_token

混合在一起

在将 facebook 用户发送到您的 api 以确认访问后,他们会以$_GET['code'] 返回到您的网站。此代码需要通过 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 的精彩解释!但是,parse_str 不起作用。我认为这是因为 API 可能略有更改。相反,json_decode 完成了这项工作。
【解决方案2】:

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

php 请求 access_token,facebook 服务器返回它。

返回的包含 access_token 的消息使用了一个like:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您在请求中发送的是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】:

        tl;博士

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

        创建和使用访问令牌

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

        创建访问令牌

        要求:

        • 应用编号:123456789012345
        • 应用密码:ZYxwVUTSRqpONMLKjiHGfeDCbA

        如果你关注access token creation guide,你会发现这个 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

        在本例中,我将关注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
        

        【讨论】:

          【解决方案6】:

          正如错误所说,它是格式错误的异常意味着格式化 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
          

          【讨论】:

          • 两个url有什么区别?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多