Нужна помощь по коду OAuthException 2500 - PullRequest
9 голосов
/ 19 февраля 2012

Я пытаюсь разработать приложение для Facebook (apps.facebook.com/some_app) с использованием PHP, где мне нужно представить некоторую информацию, основанную на музыкальных интересах пользователя. Я обнаружил, что это под "user_likes> игры".

Мои проблемы заключаются в следующем:

  • Чтобы получить доступ, я реализовал метод диалога 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>");
}
  • В настоящее время я просто пытаюсь получить публичную информацию пользователя здесь, но без успеха. Я попробовал метод Sign_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.

Спасибо

Дипак

Ответы [ 4 ]

9 голосов
/ 18 июня 2012

Ошибка 2500 означает, что у вас нет токена доступа или токена доступа к приложению, но вы пытаетесь получить доступ /me/ - «я» является заполнителем для «текущего пользователя или идентификатора страницы», поэтому не будет действительным без токена доступа дляпользователя или страницы.

Чтобы получить доступ к списку лайков пользователя, вам также потребуется разрешение user_likes при их авторизации

Наиболее вероятные причины, по которым яприложения, которые не могут обменять code на токен доступа:

  1. redirect_uri, который вы использовали, относится к корню папки или сервера и отсутствует косая черта (т. е. http://www.example.com вместо http://www.example.com/)
  2. redirect_uri, который вы использовали при первом вызове в диалоге аутентификации, не был точно таким же, как redirect_uri, который вы использовали в вызове для обмена кодом дляaccess_token

Если ваш поток аутентификации нарушен по какой-то другой причине, и вы не можете понять это из примеров SDK или документации Authentication , это может занять некоторое времячтобы поговорить с вами, потому что выможет отсутствовать некоторые базовые знания, необходимые для понимания их ответов

1 голос
/ 20 июня 2012

Я пытался получить токен авторизации с помощью 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'];
0 голосов
/ 18 июня 2012

Я решил свою проблему благодаря https://developers.facebook.com/blog/post/534/

Я просто скопировал образец и вставил в мой скрипт. Это полностью подходит. Это своего рода гибридное использование PHP и Javascript.

0 голосов
/ 20 февраля 2012

try Этот код

$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

...