Нужна помощь по коду OAuthException 2500

Я пытаюсь разработать приложение Facebook (apps.facebook.com/some_app) с использованием PHP, где мне нужно представить некоторую информацию, основанную на музыкальных интересах пользователя. Я обнаружил, что это в разделе «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"]);
  • Также попробовал код, найденный в 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.

Спасибо

Дипак


person Laraveldeep    schedule 19.02.2012    source источник
comment
Вы нашли решение? Я получаю эту ошибку даже по адресу graph.facebook.com/me. Разве он не должен вернуть мне информацию о моем Facebook?   -  person Kemal    schedule 18.06.2012


Ответы (4)


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

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

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

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

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

person Igy    schedule 17.06.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'];
person lezoconnor    schedule 20.06.2012

попробуйте этот код

$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.

person Pooya Estakhri    schedule 20.02.2012
comment
Но я настоятельно рекомендую вам использовать PHP-sdk. - person Pooya Estakhri; 20.02.2012
comment
это почти тот же код в ссылке на блог Facebook, которую я разместил выше developers.facebook.com/ блог/сообщение/500. Я уже пробовал это. С приведенным выше кодом, если я попытаюсь повторить $access_token, ничего не будет напечатано. Просто пустой. - person Laraveldeep; 20.02.2012
comment
В целях отладки я попытался повторить $response или print_r($response), но ничего не получил. Не знаю, почему я получаю нулевой/пустой ответ. Я думаю, что все пошло не так оттуда. Спасибо - person Laraveldeep; 20.02.2012
comment
Вы можете получить токен доступа самостоятельно с помощью браузера? я имею в виду, посетив этот URL-адрес graph.facebook.com oauth/access_token?client_id=APPID&redirect_uri=ЗАКОДИРОВАННЫЙ URL-адрес ВАС ПРИЛОЖЕНИЕ НРАВИТСЯ http%3A%2F%2FAPPS.FACEBOOK.COM%2FXXX%2F&client_secret=СЕКРЕТ ПРИЛОЖЕНИЯ&code=КОД, ВЫ МОЖЕТЕ ПОЛУЧИТЬ ЕГО ИЗ ПРИЛОЖЕНИЯ - person Pooya Estakhri; 20.02.2012

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

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

person Kemal    schedule 18.06.2012
comment
Какая переменная $me? в приведенном вами примере или в коде такой переменной нет - person Igy; 18.06.2012
comment
Я закодировал свой проект около 2 лет назад, и в то время facebook использовал переменную $me вместо текущей $user_id в $user_id = $facebook->getUser(); Итак, $me - это $me. Но вы правы, $me на странице нет. Извините, я удалил его. - person Kemal; 18.06.2012