it-swarm-ru.tech

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

Я использую Java, и цель моего демонстрационного приложения проста: обновить статус пользователя . Я следовал за Server Flow на странице http://developers.facebook.com/docs/authentication . Я получил диалог авторизации, Facebook привел к URL обратного вызова, и я получил code на моей странице обратного вызова. Тогда я потерпел неудачу, когда я пытаюсь сгенерировать токен доступа. 

На странице руководства говорится, что следующий 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. Так что это должно быть правильно, верно? На самом деле не могу понять, в чем проблема ....

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

43
DeepNightTwo

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

http://foo.example.com

в

http://foo.example.com/

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

63
Chip

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

6
Vinayak Suley

У меня такая же проблема. Это была разница в 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
Brad

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

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

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

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

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

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

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

3
Serexx

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

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

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

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

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

2
matt

У меня также была проблема с 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 из "", запрос на токен доступа сработал.

0
user456814

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

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

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

if ($user_id>0)

Глупости...

0
Diogo Mendonça