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 для всех следующих, безрезультатно:

  1. фактический URL-адрес запроса на мой сайт
  2. URL запроса на мой сайт, минус code параметр
  3. 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 не нужна. Кроме того, вы можете передать только один параметр. Будет рассмотрен только первый параметр запроса, остальные будут проигнорированы. Вот пример,

  1. запросить код через https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}

  2. вы получите обратный вызов для вашего url. Это будет выглядеть как http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}. Обратите внимание, что facebook сделает обратный вызов с myExtraParameter. Вы можете извлечь значение myExtraParameter из url обратного вызова.

  3. затем вы можете запросить маркер доступа с 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