【问题标题】:Need Help on OAuthException Code 2500需要有关 OAuthException 代码 2500 的帮助
【发布时间】:2012-03-10 05:02:17
【问题描述】:

我正在尝试使用 PHP 开发一个 Facebook 应用程序 (apps.facebook.com/some_app),我需要根据用户的音乐兴趣提供一些信息。我发现它在“user_likes > games”下。

我的问题如下:

  • 为了获得访问权限,我将 oauth 对话方法实现为 在我的索引页面的 API 中建议。

$auth_url = "http://www.facebook.com/dialog/oauth?client_id="
            . $app_id . "&redirect_uri=" 
            . urlencode($canvas_page)
            ."&scope=user_likes";
  • 授权成功后,我回到带有“代码”的索引页面 作为参数。

http://MY_CANVAS_PAGE/?code=some base64 encoded letters
  • 首先我不知道我是否需要 access_token 来读取用户的音乐 兴趣,但我已经尝试了所有建议的方法。我动不了 从现在开始
  • 我有这样的代码(在我的索引页中),如果代码参数未设置,它会重定向以进行授权。

if(empty($code) && !isset($_REQUEST['error'])) {
  $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
  echo("<script> top.location.href='" . $auth_url . "'</script>");
}
  • 目前我只是想在这里获取用户的公共信息,但是 没有成功。我已经按照建议尝试了 signed_request 方法 但没有成功

$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
echo ("Welcome User: " . $data["user_id"]);

print_r($decoded_response);

stdClass Object ( [error] => stdClass Object ( [message] => An active 
access token must be used to query information about the current user. 
[type] => OAuthException [code] => 2500 ) ) 

为了获取用户的公开信息,我也尝试了 PHP SDK 中的建议示例


$facebook = new Facebook(array(
'appId'  => MY_APP_ID, //registered facebook APP ID
'secret' => MY_SECRET, //secret key for APP
));

$fb_user = $facebook->getUser();

if($fb_user){
    try {
      $user_profile = $facebook->api('/me');
      echo $user_profile['email'];
    }
    catch(FacebookApiException $e) {
      $fb_user = null;
    }
}

但没有成功。有人可以解释我为什么会收到此错误以及如何正确访问用户的音乐兴趣。可能我误解了 API。

谢谢

迪帕克

【问题讨论】:

  • 您找到解决方案了吗?即使在graph.facebook.com/me url 上我也会收到此错误。它不应该返回我的 Facebook 信息吗?

标签: php facebook facebook-graph-api facebook-apps facebook-access-token


【解决方案1】:

错误 2500 表示您没有访问令牌或应用程序访问令牌,但正在尝试访问 /me/ -“我”是“当前用户或页面 ID”的占位符,因此如果没有访问令牌将无效用户或页面。

要访问用户的点赞列表,您在授权时还需要user_likes Permission

我见过的应用程序无法用code 交换访问令牌的最可能原因是:

  1. 您使用的redirect_uri 指向文件夹或服务器根目录,并且缺少尾部斜杠(即http://www.example.com 而不是http://www.example.com/
  2. 您在第一次调用身份验证对话框时使用的 redirect_uri 与您在调用中用于交换 access_token 代码的 redirect_uri 并不完全相同

如果您的身份验证流程由于某些其他原因而中断,并且您无法从 SDK 示例或 Authentication 文档中找出答案,则可能需要一段时间才能有人与您交谈,因为您可能缺少一些背景知识理解他们的答案所必需的知识

【讨论】:

    【解决方案2】:

    对我来说,我试图用 php 获取身份验证令牌,发现 2500 错误是由于 file_get_contents 没有返回任何内容的问题。我可以在浏览器中访问 URL,但不能使用 file_get_contents。我通过使用 CURL 来修复它,如下所述:https://stackoverflow.com/a/6325313

    结果是我使用了https://developers.facebook.com/docs/authentication/server-side/的代码并替换了这一行:

    $response = file_get_contents($token_url);
    

    $ch = curl_init($token_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    

    因此变成:

       $token_url = "https://graph.facebook.com/oauth/access_token?client_id="
            . $app_id . "&redirect_uri=" . urlencode($redirect_url)
            . "&client_secret=" . $app_secret
            . "&code=" . $code;
    
        /* Facebook say to use this, but file_get_contents isn't working!
        $response = file_get_contents($token_url,null, $val);
        */
    
        // Use this as an alternative
        $ch = curl_init($token_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
    
        // From https://developers.facebook.com/docs/authentication/server-side/
        $params = null;
        parse_str($response, $params);
        $access_token = $params['access_token'];
    

    【讨论】:

      【解决方案3】:

      试试这个代码

      $code = $_REQUEST["code"];
        if(empty($code)) {
          $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
          . $app_id . "&redirect_uri=" . urlencode($my_url) ;
          echo("<script>top.location.href='" . $dialog_url . "'</script>");
        }
      
        $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;
          parse_str($response, $params);
          $access_token = $params['access_token'];
      

      PS:用户邮箱地址不是公开信息,您需要 user_email 权限

      【讨论】:

      • 但是我强烈推荐你使用 PHP-sdk。
      • 这与我在developers.facebook.com/blog/post/500 上方发布的 Facebook 博客链接中的代码几乎相同。我已经尝试过了。使用上面的代码,如果我尝试回显 $access_token,则不会打印任何内容。只是空白。
      • 出于调试目的,我尝试回显 $response 或 print_r($response) 但一无所获。不知道为什么我得到空/空白响应。我认为事情从那里开始出错了。谢谢
      • 您可以通过浏览器自己获取访问令牌吗?我的意思是访问此 url graph.facebook.com oauth/access_token?client_id="APPID&redirect_uri=ENCODED URL OF YOU APP LIKE http%3A%2F%2FAPPS.FACEBOOK.COM%2FXXX%2F&client_secret=APP SECRET&code=您可以从中获取的代码APP
      【解决方案4】:

      感谢https://developers.facebook.com/blog/post/534/,我已经解决了我的问题

      我刚刚复制了示例并粘贴到我的脚本中。它完全适合。这是一种 PHP 和 Javascript 的混合使用。

      【讨论】:

      • 什么 $me 变量?您列出的示例或代码中没有这样的变量
      • 我在大约 2 年前编写了我的项目,那时 facebook 使用 $me 变量而不是当前的 $user_id $user_id = $facebook-&gt;getUser(); 所以 $me 就是 $me。但你是对的,页面上没有$me。抱歉,我已经删除了。
      猜你喜欢
      • 2016-11-24
      • 2011-09-11
      • 2021-09-05
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多