facebook error 'Ошибка проверки кода подтверждения'

очень странная ошибка. я использую руководство 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, но у меня ничего не работает


person kusanagi    schedule 08.12.2010    source источник
comment
я вижу, что мы можем использовать переопределение URL-адресов, например localhost / tes ... php / site / oauth2 а просто интересно как решить проблему   -  person kusanagi    schedule 08.12.2010


Ответы (12)


В настоящее время (по состоянию на март 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. Это может ограничить ваш доступ к некоторым разрешениям, запрошенным вами при авторизации. Это нецелесообразно.

person Michael    schedule 22.03.2011
comment
Понятия не имел, что redirect_uri должен соответствовать обоим (хотя это имеет смысл). Этот вопрос не прекращается даже спустя месяцы :) - person Julian H. Lam; 19.09.2011
comment
Здорово, Майкл! У меня была такая же проблема, когда у меня не было одинаковых параметров redirect_uri для вызовов auth и access_token. --FFS-- - person Pure.Krome; 22.09.2011
comment
Большинство кодировок Base64 содержат косую черту (/). Убедитесь, что вы используете безопасный кодировщик URL - person jontro; 06.12.2011
comment
Этот ответ сэкономил мне кучу времени. Спасибо! Учитывая, что FB знает, в чем ошибка, мне интересно, почему они не делают сообщение более информативным. - person dharmesh; 04.06.2012
comment
Конечные косые черты или их отсутствие. Остерегайтесь их. - person James Furey; 15.07.2014
comment
Хотел бы я найти этот ответ час назад. Я пытался вставить URL-адрес в redirect_uri и не мог понять, что происходит. БЛАГОДАРЮ ВАС! - person Brian; 08.09.2014

Была такая же проблема весь день при тестировании с redirect_uri=http://localhost:8000 (закодировано в _2 _) ...

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

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

person Jason    schedule 27.07.2011
comment
2 часа ... 2 часа потраченного на это времени ... Спасибо - person Clynamen; 07.10.2012
comment
Потрачено 3 часа - отлично! Спасибо! - person Allen Gingrich; 22.01.2015
comment
1 час потрачен впустую - Спасибо! - person sergiovilar; 06.10.2015
comment
2 дня - Большое спасибо! - person Nam Pham; 29.03.2016
comment
Часы потрачены впустую. Добавление Slash ничего для меня не изменило. - person Antony D'Andrea; 25.05.2021

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

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

http://myredirecturi.com

to

http://myredirecturi.com/

Ага, просто добавил косую черту в конце, и это сработало.

person Adam Waite    schedule 11.10.2012
comment
Была такая же проблема, но на Java. Невероятно, но косая черта в конце решила эту проблему :( ОООФ. Спасибо. - person AlikElzin-kilaka; 05.09.2015
comment
Вы супергерой. ????‍♂️ - person Mehul; 10.06.2021

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

person Nizar B.    schedule 24.12.2013
comment
Сработало у меня! Спасибо! - person StevieD; 22.03.2015

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

Это правда, что параметр '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']));

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

person John    schedule 09.10.2011

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

person DannyD    schedule 14.02.2011
comment
удаление? из URL-адреса решила проблему для меня. Спасибо. - person Ajibola; 06.02.2014

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

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');
person Ivan    schedule 08.12.2010
comment
этот сработал для меня - это должен быть '/' в параметре, который вызвал проблему - спасибо - person Richard; 18.11.2014

У меня был pb и, наконец, исправил его, добавив параметр type = client_cred в URL-адрес.

person juamee    schedule 12.12.2010
comment
Я бы не рекомендовал это. Параметр type = client_cred предназначен для другого варианта использования. - person Bryan; 17.08.2011

Некоторое время боролся с этим. Поскольку мне не нужно перенаправление, но требуется параметр перенаправления, я решил просто установить для него нулевое значение -

...&redirect_uri=&client_secret=...
person Hayden Linder    schedule 28.07.2020

У меня была такая же проблема.

По общему признанию, я супер-новичок, так что извините, если это решение не имеет никакого смысла на практике.

Я просто устанавливаю короткий файл cookie (1-2 мин) с тестовой переменной на странице с моей кнопкой FB Connect. Когда FB вернулся с информацией к моему сценарию синтаксического анализа / обработки данных, я проверил этот файл cookie, куда я его перенаправлял, и, если он был найден, направил пользователя на правильный URL-адрес, используя header: location.

Конечно, некоторые браузеры / пользователи и т. Д. Отключают файлы cookie. Очевидно, это там не сработает (может быть, использовать сессию var и уничтожить ее в обработчике данных fb?) Я уверен, что есть лучший способ сделать это, но на данный момент этот бандаж работает.

person Evan M. Rose    schedule 01.06.2011

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

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

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

person Lars Nieuwenhuizen    schedule 23.08.2012

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

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

Хотя, похоже, работает без косой черты.

person Larry Weya    schedule 14.09.2011
comment
Куда мне пойти, чтобы включить красивые URL-адреса в конфигурации? - person Marquizzo; 04.12.2014