2010-12-08 2 views
53

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

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, я получаю сообщение об ошибке «Ошибка проверки кода проверки». я проверил evering, ошибка в ? r = site/oauth2, но мне нужно передать некоторые параметры может кто-нибудь мне помочь? Я читаю сообщение http://forum.developers.facebook.net/viewtopic.php?id=70855 но ничего не работает для меня

+0

Я вижу, что мы можем использовать переписывание URL как http: //localhost/tes...php/site/oauth2, но это просто интересно, как решить проблему. – kusanagi 2010-12-08 12:59:42

ответ

125

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

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

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

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

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

И наконец, это скорее примечание. Есть много программистов, проходящих мимо дезинформации, что простым решением является передать тип = client_cred. Это может ограничить ваш доступ к некоторым разрешениям, которые вы запрашивали при авторизации. Это нецелесообразно.

+1

Отличное объяснение, спасибо за это – 2011-05-08 04:33:15

+1

спасибо :) был полезным – DhruvPathak 2011-05-26 08:13:49

+2

@ Майкл - мужчина! – 2011-08-24 01:28:54

2

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

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2'); 
+0

это не помогло - я пробовал – kusanagi 2010-12-08 15:59:23

+0

этот работал для меня - это должно быть «/» в параметре, вызвавшем проблему - спасибо – Richard 2014-11-18 12:39:18

1

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

+2

Я бы не рекомендовал это. Параметр type = client_cred используется для другого варианта использования. – Bryan 2011-08-17 15:33:44

5

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

+0

удаление? от url sovled проблема для меня. Благодарю. – Ajibola 2014-02-06 15:25:19

0

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

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

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

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

47

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

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

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

0

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

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

Это, кажется, работает без слэш, хотя.

6

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

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

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

0

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

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

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

16

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

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

http://myredirecturi.com 

в

http://myredirecturi.com/ 

Yeh, просто добавил слэш, и она работала.

8

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

Смежные вопросы