google oauth2 redirect_uri з кількома параметрами


120

Як додати параметри до google oauth2 redirect_uri?

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

bЗ a=bє випадковим.

Хто-небудь може допомогти?

Відповіді:


235
  1. Ви не можете нічого додати до ури переадресації, урі переадресації є постійною, як встановлено в налаштуваннях програми Oauth. наприклад: http://www.example.com/redirect.html

  2. Щоб передати декілька параметрів state урі- переспрямування, зберегти їх у параметрі перед тим, як викликати URL-адресу Oauth, URL-адреса після авторизації надішле вам ті ж параметри, що й урі-переспрямування, як state=THE_STATE_PARAMETERS

Тож для вашого випадку зробіть це:

/ 1. створити рядок json своїх параметрів ->

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

/ 2. зробіть base64UrlEncode, щоб зробити його URL безпечним ->

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

Це приклад PHP базового64UrlEncoding & декодування ( 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


base64 використовується для придушення даних, а також для кодування URL, якщо вам знадобиться трохи додаткової 'безпеки' через неясність.
ricosrealm

@DhruvPathak ідеально, мені потрібно було надіслати спеціальний параметр назад із перенаправленням API API, і це той самий метод, який ви описали.
еріцикони

5
Параметр стану використовується для запобігання атак CSRF під час потоку OAuth. Ви повинні встановити маркер у параметрі стану під час ініціювання потоку, і ви повинні перевірити, чи повертаєте ви той самий маркер у параметрі стану, коли ваш redirect_uri потрапляє. Не робіть того, що зроблено у цій відповіді. Напевно, рішення, що базується на сеансі, - це те, на що слід звернути увагу.
Рахім

2
Як я можу використовувати stateпарам для передачі декількох параметрів для перенаправлення урі та одночасного запобігання CSRFатаці ?
пеклобоя

1
@hellboy Мені цікаво те саме. Чи вдалося вам додати кілька параметрів до парам-стану (спеціальні значення та запобігти CSRFатакам)?
Кевін Еторе

4

Якщо ви перебуваєте в .NET, ви можете зберегти параметри в сесії

HttpContext.Current.Session[{varname}]

і перенаправити на сторінку авторизації без параметрів

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
Це не масштабується при використанні webfarm, наприклад, azure.
витрачається

3
@spender: значить, ви маєте на увазі, що два запити майже послідовно від одного клієнта можуть оброблятися різними серверами в webfarm. Якщо це так, це не єдине, на що впливає, в основному змінна сесія не може бути використана в цьому сценарії ні для чого. BTW: Я не сперечаюся - насправді тут намагаюся навчитися.
rufo

6
Це цілком можливо, так ... Це можна пом'якшити, керуючи сеансом за допомогою сеансового сервера або відключивши сеанс до бази даних (див. Msdn.microsoft.com/en-us/library/ms178586.aspx ) або включити липкі сеанси на вашому балансирі завантаження, щоб клієнти завжди поверталися до того ж вузла веб-сервера. Усі параметри, про які я згадував, - це налаштування PITA, тому IMO, зберігання будь-якого стану клієнта, Sessionслід уникати.
витрачається

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 = сторінка / view - це параметр, на який я хочу відповідь з параметром


Тут відправляється параметр стану в наданому google PHP-коді. Існує три запити на стороні сервера. Це означає, що остаточний запит взагалі не матиме змінних рядків запиту.
lol

працює як шарм! Я знаю, що ми можемо надсилати інформацію в параметрі штату, але якщо програма очікує будь-якого значення безпосередньо як параметр запиту, вона не працює. Наведений вами метод ідеально підходить для цього сценарію. Дякую!
Джаянт Варшні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.