Ошибка facebook 'Ошибка проверки кода подтверждения' - PullRequest
54 голосов
/ 08 декабря 2010

очень странная ошибка. я использую gide http://developers.facebook.com/docs/authentication/., поэтому я создаю запрос к fb и передаю redirect_uri. Я использую тестовый сайт на localhost. так что если я пройду

redirect_uri = http://localhost/test_blog/index.php

работает нормально, но если я пройду

redirect_uri = http://localhost/test_blog/index.php?r=site/oauth2

это не хочет работать. я пытаюсь использовать

redirect_uri =. UrlEncode ( 'http://localhost/test_blog/index.php?r=site/oauth2)

но не работает. я пытаюсь объяснить. Я успешно получаю код, но когда я получаю доступ к https://graph.facebook.com/me?access_token, я получаю сообщение об ошибке «Ошибка проверки кода подтверждения». я проверил вечность, ошибка в ? r = site / oauth2 но мне нужно передать некоторые параметры кто-нибудь может мне помочь? я прочитал пост http://forum.developers.facebook.net/viewtopic.php?id=70855 но у меня ничего не работает

Ответы [ 11 ]

128 голосов
/ 22 марта 2011

В настоящее время (по состоянию на март 2011 г.) недокументированные требования относительно того, что делает действительным redirect_uri.

Во-первых, оба параметра redirect_uri для авторизации и access_token должны совпадать .

Очевидно, Facebook (или, скорее, OAuth2) использует redirect_uri в качестве внутреннего ключа для кодирования возвращаемого кодадля запроса access_token.Это довольно умно, так как он проверяет обратно на ваш сайт.Это объясняет, почему для запроса access_token, который иначе не нуждался бы в параметре redirect_uri, требуется один.

Во-вторых, вы не можете использовать много специальных символов в redirect_uri .

Многообсуждения бушует, могут ли параметры быть переданы вообще.Они могут, вы ограничены, какие символы действительны, но никто не опубликовал список, который я знаю.Традиционные методы, такие как кодировка url / html, не будут работать, поскольку процент (%) недопустим.Косая черта (/) также недопустима, поэтому вложенный URL перенаправления всегда будет неудачным.ЕДИНСТВЕННЫЙ способ преодолеть специальное ограничение char - это закодировать значение параметра в base64.Если вы используете ASP.NET, найдите Convert.ToBase64.

Наконец, и это скорее второстепенная заметка.Многие программисты передают дезинформацию о том, что простым решением является передача type = client_cred.Это может ограничить ваш доступ к некоторым разрешениям, которые вы запрашивали в своем разрешении.Это нежелательно.

51 голосов
/ 27 июля 2011

При тестировании с redirect_uri=http://localhost:8000 (с кодировкой http%3A%2F%2Flocalhost%3A8000) была такая же проблема весь день ...

Решением было просто поставить косую черту / в концеUri.Итак, redirect_uri=http://localhost:8000/ (закодировано в http%3A%2F%2Flocalhost%3A8000%2F).

Опять же, убедитесь, что redirect_uri одинаково для обоих запросов.

17 голосов
/ 11 октября 2012

У меня была эта проблема. Я точно знал, что мои URL были одинаковыми, потому что я использовал класс с тем же $ var, но я продолжал получать ответ 400 и эту ошибку в ответе JSON.

Единственное, что я сделал, это изменил мой redirect_uri с:

http://myredirecturi.com

до

http://myredirecturi.com/

Да, только что добавил косую черту, и это сработало.

8 голосов
/ 24 декабря 2013

На самом деле вам не нужно кодировать, просто поставьте '/' в конце вашего redirect_url, и все должно быть хорошо!

6 голосов
/ 09 октября 2011

Часть информации, предоставленной Аароном Уилером, неверна.

Действительно, параметр 'redirect_uri' должен быть одинаковым в обоих запросах, однако вполне возможно, чтобы URL кодировал обычный URL и используйте его в качестве значения для параметра 'redirect_url', при условии, что вы будете осторожны при дальнейшем URL-кодировании любых встроенных URL-адресов.

Например, вы хотите, чтобы Facebook перенаправил на следующий URL-адрес:

http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants

Попытка перенаправить пользователя на

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
. urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');

Не удастся, так как /Party/Pants создает недопустимый URL-адрес

Однако, перенаправление на

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode('/Party/pants'));

Будет работать должным образом.

Если вы используете возвращенное значение redrect_uri во втором запросе приложения для аутентификации, убедитесь, что url-код еще раз - значение автоматически декодируется URL при заполнении$ _GET суперглобальный .- Это то, что сбило меня с толку.

'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode($_GET['my_param_1']));

Ps В вашем реальном коде я бы порекомендовал использовать sprintf () вместо цепочки строк, как в моем примере, для лучшей читаемости.

5 голосов
/ 14 февраля 2011

Из того, что я вижу, проблема в том, что redirect_uri должен заканчиваться на '/' и не содержать '?'или другие специальные символы.Я думаю, именно поэтому вы получаете «Ошибка проверки кода подтверждения».Эта ошибка появляется только в том случае, если вы используете file_get_contents (), а не при использовании php-библиотеки facebook.Это решение для PHP, не знаю, если эта ошибка появляется в других SDK.

2 голосов
/ 08 декабря 2010

Я не уверен, поможет ли это, но я бы предложил закодировать только значения в URL. Не все это например:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');
1 голос
/ 12 декабря 2010

Я получил pb и, наконец, исправил это, добавив параметр type = client_cred в URL.

0 голосов
/ 24 августа 2012

Ответ для меня был такой:

$user = $facebook->getUser();     
if (!$user) {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => '',
        'redirect_uri' => $this->domain,
    ));
    print('<script> top.location.href=\'' . $loginUrl . '\'</script>');
}

Я долго ломал голову, прежде чем нашел это решение, похоже, я не единственный, кто столкнулся с этой проблемой, надеюсь, вам это удастся!

0 голосов
/ 14 сентября 2011

Я заметил, что вы используете Yii, который я использую, и у меня была такая же проблема в течение половины дня. Как уже упоминалось, проблема заключается в специальных символах в вашем URL i.e. r=site/oath2

Вы можете исправить это, включив красивые URL-адреса в вашей конфигурации, чтобы ваш URL стал index.php/site/oath2

Кажется, что он работает без конечной косой черты.

...