Подтвердить что ты не робот

Не удалось получить токен доступа из Facebook. Получил OAuthException говорит: "Ошибка проверки кода проверки"

Я использую java, и цель моего демонстрационного приложения проста: обновить статус пользователя. Я выполнил Серверный поток на странице http://developers.facebook.com/docs/authentication. Я получил диалог auth, facebook привел к URL-адресу обратного вызова, и я получил код на моей странице обратного вызова. Затем я потерпел неудачу, когда попытался создать токен доступа.

На странице руководства говорится, что для создания токена доступа можно использовать следующий URL-адрес:

https://graph.facebook.com/oauth/access_token?
     client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
     client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

Но что происходит в моей среде, я получил следующее сообщение об ошибке:

{
   "error": {
      "type": "OAuthException",
      "message": "Error validating verification code."
   }
}

Я уверен, что каждый параметр правильный, потому что, если я изменю параметр client_id или client_secret, у меня появится другое сообщение об ошибке. Параметр кода - это то, что я получил от обратного вызова facebook. Так что это должно быть правильно, не так ли? На самом деле не могу понять, в чем проблема....

Есть идеи об этом? Я застрял здесь...

4b9b3361

Ответ 1

Недавно я столкнулся именно с этой проблемой: все согласовано, но с ошибкой OAuthException это не получилось. То, что сделало его работу, состояло в том, чтобы изменить перенаправление uri (в обоих запросах на поток):

http://foo.example.com

к

http://foo.example.com/

I.e., добавьте конечную косую черту. И тогда это сработало. Глупый и глупый, но там вы идете.

Ответ 2

У меня была такая же проблема и я попробовал вышеуказанные предложения. Они помогли, но в моем случае проблема заключалась в том, что у моего redir-URL был параметр запроса, и Facebook не был крут с этим. Итак, мораль истории состоит в том, что redir url, который вы отправили для обмена токеном, должен быть идентичным исходному URL-адресу redir и не может иметь параметры запроса.

Ответ 3

Мы тоже немного позаботились об этом.

В нашем случае конечная косая черта в URL-адресе уже была там, поэтому я попробовал токен, который мы использовали в FB Debug Tool, и он подтвержденный, поэтому было похоже, что FB даже не видел токена в запросе.

После некоторого расследования я нашел head-slapper - мы делаем GET с заголовками HTTP только не с Querystring, поэтому FB литерно не видел токена вообще.

Мораль, похоже, заключается в том, что если вы можете получить токен для проверки в средстве отладки FB, в вашем запросе есть вероятность/что-то/нехорошее -

Это может быть отсутствующее "/" или другое несоответствие с URL-адресом, определенным приложением (Domain mistmatch - это другая ошибка). Я не пробовал определять App/Web Url для HTTPS и делать запрос с помощью HTTP, но я подозреваю, что он также будет икотой.

Или, как в нашем случае, метод запроса может быть неправильным - GET с заголовками или POSTing оба выбрасывают 2500, вам нужно выполнить GET с помощью Querystring.

Надеюсь, что это поможет!

Ответ 4

У меня была та же проблема. Это была разница в URL, но в отличие от других, которые выложили, моя разница между HTTP и HTTPS.

У нас есть BigIP, обрабатывающий HTTPS-запросы и пересылая сервер HTTP Apache. Когда вызывалась функция BaseFacebook getCurrentUrl(), он обнаружил HTTP, а не оригинальный HTTPS. Я изменил эту функцию следующим образом:

protected function getCurrentUrl() {
    if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) ||
        (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || 
        (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) {
      $protocol = 'https://';
    }
    else {
      $protocol = 'http://';
    }
...

Эта версия поддерживает ключ HTTP_PSEUDOSSL. Надеюсь, это поможет кому-то.

Ответ 5

Да, трейлинг-слэш помог мне тоже, спасибо!

В целях отладки я счел полезным использовать именно код fb на странице разработчика:

http://developers.facebook.com/docs/authentication/

Как только вы получите это, вы можете изменить его, чтобы он соответствовал вашему собственному коду.

Я не уверен, но вы также можете проверить, правильно ли указаны настройки "URL-адрес сайта" и "Домены сайта" на экране "Редактирование приложений", поскольку согласно документации, redirect_uri должен находиться в том же домене, (Это отличается от URL-адреса страницы холста/вкладки.)

Ответ 6

У меня также была проблема с url, но решение для нее было другим. Я передавал signedRequest, который возвращает JavaScript SDK на сервер и используя значение code, чтобы запросить токен доступа. Однако, согласно некоторым комментариям в версии 3.1.1 Facebook PHP SDK, SDK JavaScript связывает code с redirect_uri пустой строки, т.е. "":

// the JS SDK puts a code in with the redirect_uri of ''
if (array_key_exists('code', $signed_request)) {
    $code = $signed_request['code'];
    $access_token = $this->getAccessTokenFromCode($code, '');
    if ($access_token) {
       // etc
    }
}

После того, как я изменил свой собственный код на стороне сервера, чтобы использовать redirect_uri для "", тогда работал запрос на токен доступа.

Ответ 7

в моем случае мой код не работал над IE. Проблема была в следующей строке

$user_id = $facebook->getUser();
if ($user_id)

Потому что почему-то функция getUser всегда возвращала 0, так что условие всегда было правдой. Чем он сгенерировал эту ошибку из недействительного токена. Ну, я исправил это, просто сказав это:

if ($user_id>0)

Глупый материал...