Facebook OAuth: пользовательские параметры 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
мой редирект вызывается после отправки диалога авторизации, и я возвращаю код аутентификации, но когда я пытаюсь получить свой токен доступа, я получение ошибки 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 или есть какой-то лучший шаблон для предоставления контекста на мой веб-сайт?
4 ответов
я понял ответ; вместо того, чтобы добавлять дополнительные параметры к 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 обратного вызова.
Если по какой-либо причине вы не можете использовать вариант, предложенный Джейкобом, поскольку это мой случай, вы можете urlencode код redirect_uri
параметр перед его передачей, и он будет работать, даже с полной querystring как foo=bar&morefoo=morebar
в нем.
Я пытался реализовать рабочий процесс входа в 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 после первого параметра запроса, будет проигнорирован. Также не включайте недопустимые символы в параметр запроса (см. этой дополнительные информация.)
вам лучше всего указать уникальный обратный вызов для каждого поставщика oAuth,/oauth/facebook
, /oauth/twitter
etc.
если вы действительно хотите, чтобы один и тот же файл отвечал на все запросы oAuth, включите его в отдельные файлы или настройте путь, который вызовет тот же файл на вашем сервере .htaccess перенаправляет или что-то подобное: /oauth/*
>oauth_callback.ext