Facebook OAuth: пользовательские параметры callback_uri
Я бы хотел иметь динамический URL-адрес перенаправления для моей интеграции с Facebook OAuth2. Например, если мой URL-адрес перенаправления указан в моем приложении Facebook:
http://www.mysite.com/oauth_callback?foo=bar
Я бы хотел, чтобы URL-адрес перенаправления для конкретного запроса был примерно таким, так что на сервере у меня есть некоторый контекст о том, как обрабатывать код аутентификации:
http://www.mysite.com/oauth_callback?foo=bar&user=6234
Моя перенаправка вызывается после отправки диалога авторизации, и я возвращаю код auth, но когда я пытаюсь получить токен доступа, я получаю ошибку OAuthException из Facebook. Мой запрос выглядит так (добавление строк для ясности):
https://graph.facebook.com/oauth/access_token
?client_id=MY_CLIENT_ID
&redirect_uri=http%3A%2F%2Fwww.mysite.com%2Foauth_callback%3Ffoo%3Dbar%26user%3D6234
&client_secret=MY_SECRET
&code=RECEIVED_CODE
Все мои параметры кодируются по URL-адресу, и код выглядит действительным, поэтому я предполагаю, что параметр проблемы - это мой redirect_uri. Я попытался установить redirect_uri
на все следующие, безрезультатно:
- Фактический URL-адрес запроса на мой сайт
- URL-адрес запроса на мой сайт, минус параметр
code
- URL-адрес, указанный в моей настройке приложения Facebook
Поддерживаются ли пользовательские параметры URI перенаправления? Если да, я правильно их определяю? Если нет, будет ли я вынужден установить файл cookie, или есть какой-то лучший шаблон для подачи контекста на мой веб-сайт?
Ответы
Ответ 1
Я понял ответ; вместо добавления дополнительных параметров к URL-адресу перенаправления, вы можете добавить параметр state
к запросу https://www.facebook.com/dialog/oauth
:
https://www.facebook.com/dialog/oauth
?client_id=MY_CLIENT_ID
&scope=MY_SCOPE
&redirect_uri=http%3A%2F%2Fwww.mysite.com%2Foauth_callback%3Ffoo%3Dbar
&state=6234
Этот параметр состояния затем передается URL-адресу обратного вызова.
Ответ 2
Если по какой-либо причине вы не можете использовать опцию, предложенную Джейкобом в качестве моего аргумента, вы можете urlencode указать свой параметр redirect_uri
перед тем, как передать его, и он будет работать даже с полный запрос, например foo=bar&morefoo=morebar
.
Ответ 3
Я пытался внедрить рабочий процесс входа в Facebook с API v2.9 после этот учебник. Я попробовал решения, описанные выше. Ответ Мануэля вроде как правильный, но я заметил, что кодировка url не нужна. Кроме того, вы можете передать только один параметр. Будет рассмотрен только первый параметр запроса, остальные будут проигнорированы. Вот пример,
-
Запросить код через https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}
-
Вы получите обратный вызов для своего URL-адреса. Он будет выглядеть как http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}
. Обратите внимание, что facebook сделает обратный вызов с помощью myExtraParameter
. Вы можете извлечь значение для myExtraParameter
из URL-адреса обратного вызова.
-
Затем вы можете запросить токен доступа с помощью https://graph.facebook.com/v2.9/oauth/access_token?client_id={app-id}&client_secret={app-secret}&code={code-from-facebook}&redirect_uri=http://{url}/login-redirect?myExtraParameter={value-extracted-in-step-2}
Дополнительный параметр, переданный на шаге 1 после того, как первый параметр запроса будет проигнорирован. Также не забудьте указать какие-либо недопустимые символы в параметре запроса (подробнее см. .
Ответ 4
Лучше всего указать уникальный обратный вызов для каждого поставщика oAuth, /oauth/facebook
, /oauth/twitter
и т.д.
Если вы действительно хотите, чтобы один и тот же файл отвечал на все запросы oAuth, включите его в отдельные файлы или настройте путь, который будет вызывать тот же файл на вашем сервере, используя перенаправления .htaccess или что-то подобное: /oauth/*
> oauth_callback.ext