google oauth2 redirect_uri с несколькими параметрами

120

Как добавить параметры в google oauth2 redirect_uri?

Просто вот так redirect_uri=http://www.example.com/redirect.html?a=b.

bИз a=bявляется случайным.

Кто-нибудь может помочь?

Eason
источник

Ответы:

236
  1. Вы не можете ничего добавить к uri перенаправления, uri перенаправления является постоянным, как установлено в настройках приложения Oauth. например: http://www.example.com/redirect.html

  2. Чтобы передать несколько параметров вашему uri перенаправления, сохраните их в state параметре перед вызовом URL-адреса Oauth, URL-адрес после авторизации отправит те же параметры в ваш URI перенаправления, что и state=THE_STATE_PARAMETERS

Итак, для вашего случая сделайте следующее:

/ 1. создайте строку json ваших параметров ->

{ "a" : "b" , "c" : 1 }

/ 2. сделайте base64UrlEncode, чтобы сделать его безопасным для URL ->

stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');

Это PHP-пример кодирования и декодирования base64UrlEncoding ( http://en.wikipedia.org/wiki/Base64#URL_applications ):

function base64UrlEncode($inputStr)
{
    return strtr(base64_encode($inputStr), '+/=', '-_,');
}

function base64UrlDecode($inputStr)
{
    return base64_decode(strtr($inputStr, '-_,', '+/='));
}

Итак, теперь состояние будет примерно таким: stateString -> asawerwerwfgsg,

Передайте это состояние в URL-адресе авторизации OAuth:

https://accounts.google.com/o/oauth2/auth?
  client_id=21302922996.apps.googleusercontent.com&
  redirect_uri=https://www.example.com/back&
  scope=https://www.google.com/m8/feeds/&
  response_type=token&
  state=asdafwswdwefwsdg,

Для потока на стороне сервера он будет поставляться вместе с токеном: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Для потока на стороне клиента это будет хэш вместе с токеном доступа: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Получите состояние, base64UrlDecode его, json_decode его, и у вас есть данные.

Подробнее о Google OAuth 2 можно узнать здесь:

http://code.google.com/apis/accounts/docs/OAuth2.html

DhruvPathak
источник
base64 используется для обфускации данных, а также для их кодирования URL-адреса, если вам потребуется немного дополнительной «безопасности» через скрытность.
ricosrealm
@DhruvPathak отлично, мне нужно было отправить настраиваемый параметр обратно с перенаправлением linkedin API и тем же методом, который вы описали.
ericsicons
5
Параметр состояния используется для предотвращения атак CSRF во время потока OAuth. Вы должны установить токен в параметре состояния при запуске потока, и вы должны проверить, получаете ли вы тот же токен в параметре состояния, когда ваш redirect_uri поражен. Не делайте того, что написано в этом ответе. Вам, вероятно, следует обратить внимание на решение на основе сеанса.
Рахим
2
Как я могу использовать stateparam для передачи нескольких параметров для перенаправления uri и предотвращения CSRFатаки одновременно ?
hellboy
1
@hellboy Мне интересно то же самое. Удалось ли добавить в параметр состояния несколько параметров (настраиваемые значения и предотвращение CSRFатак)?
Кевин Эторе
4

Если вы находитесь в .NET, вы можете сохранить параметры в сеансе

HttpContext.Current.Session[{varname}]

и перенаправить на страницу авторизации без параметров

Response.Redirect(your_uri_approved_with_no_querystring_parameters);
Rufo
источник
4
Это не масштабируется при использовании веб-фермы, такой как лазурь.
Спендер
3
@spender: значит, вы подразумеваете, что два запроса почти последовательно от одного и того же клиента могут обрабатываться разными серверами в веб-ферме. Если это так, это не единственное, что затронуто, в основном переменная сеанса не может использоваться в этом сценарии ни для чего. BTW: Я не спорю - на самом деле пытаюсь учиться здесь.
rufo
6
Это вполне возможно, да ... Вы можете смягчить это, управляя сеансом с сервером сеанса или резервным сеансом в базе данных (см. Msdn.microsoft.com/en-us/library/ms178586.aspx ) или включив липкие сеансы на вашем балансировщике нагрузки, чтобы клиенты всегда возвращались к одному и тому же узлу веб-сервера. Все параметры, которые я упомянул, - это настройка PITA, поэтому ИМО Sessionследует избегать хранения любого состояния клиента .
spender
2

Вы можете перенаправить параметр с URL-адресом, как показано ниже,

Когда вы получаете ответ от Google, вы можете передать параметр с URL-адресом,

См. Ниже php- код для того же,

if (isset($_GET['code'])) {
   $client->authenticate();
   $_SESSION['token'] = $client->getAccessToken();
   $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
   header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL) . '?r=page/view');

}

В приведенном выше примере r = page / view - это параметр, на который я хочу получить ответ с параметром

Киран
источник
Именно сюда отправляется параметр состояния в предоставленном Google коде PHP. На стороне сервера сделано три запроса. Это означает, что в окончательном запросе вообще не будет переменных строки запроса.
lol
работает как шарм! Я знаю, что мы можем отправлять информацию в параметре состояния, но если приложение ожидает какое-либо значение непосредственно в качестве параметра запроса, оно не выполняется. Предоставленный вами метод идеально подходит для этого сценария. Спасибо!
Джаянт Варшней