Facebook OAuth: пользовательские параметры callback_uri - PullRequest
67 голосов
/ 24 июня 2011

Я хотел бы иметь URL-адрес динамического перенаправления для интеграции с OAuth2 в Facebook. Например, если мой 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 перенаправления? Если да, правильно ли я их указываю? Если нет, я буду вынужден установить куки или есть какой-то лучший шаблон для предоставления контекста моему веб-сайту?

Ответы [ 4 ]

91 голосов
/ 24 июня 2011

я разобрался с ответом;вместо добавления дополнительных параметров в 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-адрес обратного вызова.

12 голосов
/ 27 апреля 2012

Если по какой-либо причине вы не можете использовать опцию, предложенную Джейкобом, поскольку это мой случай, вы можете urlencode ваш redirect_uri параметр до его передачи, и он будет работать, даже с полнымСтрока запроса, например foo=bar&morefoo=morebar.

3 голосов
/ 11 июля 2017

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

0 голосов
/ 13 июня 2016

Лучше всего указать уникальный обратный вызов для каждого провайдера oAuth, /oauth/facebook, /oauth/twitter и т. Д.

Если вы действительно хотите, чтобы один и тот же файл отвечал на все запросы oAuth, либо включите его в отдельные файлы, либо укажите путь, по которому тот же файл будет вызываться на вашем сервере с помощью перенаправлений .htaccess, либо что-то подобное: /oauth/*> oauth_callback.ext

...