Невозможно получить токен доступа из Facebook.Получил OAuthException говорит "Ошибка проверки кода подтверждения" - PullRequest
43 голосов
/ 15 февраля 2011

Я использую Java, и цель моего демонстрационного приложения проста: обновить статус пользователя. Я следовал за Потоком на стороне сервера на странице http://developers.facebook.com/docs/authentication. Я получил диалог авторизации, 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. Так что это должно быть правильно, верно? На самом деле не могу понять, в чем проблема ....

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

Ответы [ 7 ]

64 голосов
/ 22 февраля 2011

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

http://foo.example.com

на

http://foo.example.com/

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

6 голосов
/ 09 мая 2012

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

3 голосов
/ 15 июня 2012

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

У нас BigIP обрабатывает HTTPS-запросы и перенаправляет их на HTTP-сервер Apache. Когда была вызвана функция getCurrentUrl () BaseFacebook, она обнаружила 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. Надеюсь, это кому-нибудь поможет.

3 голосов
/ 03 мая 2012

Мы тоже повеселились с этим.

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

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

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

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

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

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

2 голосов
/ 15 апреля 2011

Да, косая черта работала и для меня, спасибо!

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

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

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

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

0 голосов
/ 29 апреля 2013

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

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

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

if ($user_id>0)

Глупые вещи ...

0 голосов
/ 13 июля 2012

У меня также была проблема с URL, но ее решение другое. Я передавал signedRequest, который JavaScript SDK возвращает на сервер, и использовал значение code для этого, чтобы запросить токен доступа. Однако, согласно некоторым комментариям в версии 3.1.1 Facebook PHP SDK , JavaScript SDK связывает 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 из "", запрос на токен доступа сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...