it-swarm.com.ru

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

Мой редирект вызывается после отправки диалога авторизации, и я получаю код авторизации, но когда я пытаюсь получить свой токен доступа, я получаю ошибку 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 или есть какой-то лучший шаблон для предоставления контекста моему веб-сайту?

65
Jacob

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

91
Jacob

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

12
Manuel Pedrera

Я пытался реализовать рабочий процесс входа в 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 ).

3
mert