需要关于OAuthException代码2500的帮助

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

我的问题如下:

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

  • $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"]);
    
  • 还尝试了http://developers.facebook.com/blog/post/500/中找到的代码

    但是在尝试获取调试信息时出现错误


  • 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。

    谢谢

    迪帕克


    错误2500意味着您没有访问令牌或应用程序访问令牌,但正尝试访问/me/ - '我'是'当前用户或页面ID'的占位符,因此如果没有用户的访问令牌页。

    要访问用户的喜好列表,您在授权时还需要user_likes权限

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

  • 您使用的redirect_uri是一个文件夹或服务器根目录,并且缺少一个结尾斜杠(即http://www.example.com而不是http://www.example.com/
  • redirect_uri您在第一次调用的身份验证对话框中使用是不正是一样的redirect_uri您在调用中使用exchagne代码为的access_token
  • 如果您的授权流程由于某些其他原因而中断,并且您无法从SDK示例或身份验证文档中找到它,则可能需要一段时间才能有人与您通话,因为您可能会遗漏一些必要的背景知识以了解它们答案


    对我来说,我试图用php获得一个auth令牌,并发现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'];
    

    试试这个代码

    $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权限

    链接地址: http://www.djcxy.com/p/76513.html

    上一篇: Need Help on OAuthException Code 2500

    下一篇: NoSuchMethodException Thrown when method exists