google oauth2 redirect_uri z kilkoma parametrami

120

Jak dodać parametry do google oauth2 redirect_uri?

Tak po prostu redirect_uri=http://www.example.com/redirect.html?a=b.

bOd a=bjest przypadkowa.

Czy ktoś może pomóc?

eason
źródło

Odpowiedzi:

235
  1. Nie możesz nic dodać do adresu uri przekierowania, adres uri przekierowania jest stały, zgodnie z ustawieniami aplikacji Oauth. np .: http://www.example.com/redirect.html

  2. Aby przekazać kilka parametrów do twojego przekierowania uri, state zapisz je w parametrze przed wywołaniem Oauth url, adres url po autoryzacji wyśle ​​te same parametry do twojego przekierowania uri jak state=THE_STATE_PARAMETERS

Więc w swoim przypadku zrób to:

/ 1. utwórz ciąg json swoich parametrów ->

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

/ 2. wykonaj base64UrlEncode, aby adres URL był bezpieczny ->

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

To jest przykład PHP base64UrlEncoding & decoding ( http://en.wikipedia.org/wiki/Base64#URL_applications ):

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

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

Więc teraz stan wyglądałby tak: stateString -> asawerwerwfgsg,

Przekaż ten stan w adresie URL autoryzacji 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,

W przypadku przepływu po stronie serwera będzie on dostarczany wraz z tokenem: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

W przypadku przepływu po stronie klienta pojawi się w skrócie wraz z tokenem dostępu: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Pobierz stan, base64UrlDecode it, json_decode it i masz swoje dane.

Zobacz więcej o Google OAuth 2 tutaj:

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

DhruvPathak
źródło
base64 jest używany do zaciemniania danych, a także kodowania ich adresu URL, jeśli potrzebujesz trochę dodatkowego „bezpieczeństwa” poprzez zaciemnienie.
ricosrealm
@DhruvPathak doskonały, potrzebowałem odesłać niestandardowy parametr z powrotem za pomocą przekierowania linkedin API i jest to ta sama metoda, którą opisałeś.
ericsicons
5
Parametr state służy do zapobiegania atakom CSRF podczas przepływu OAuth. Musisz ustawić token w parametrze stanu podczas inicjowania przepływu i powinieneś sprawdzić, czy otrzymujesz ten sam token w parametrze stanu, gdy zostanie trafiony twój redirect_uri. Nie rób tego, co zostało opisane w tej odpowiedzi. Rozwiązanie oparte na sesji jest prawdopodobnie tym, na co powinieneś zwrócić uwagę.
Rahim
2
Jak mogę używać stateparam przejść kilka parametrów w celu przekierowania URI i zapobiec CSRFataku w tym samym czasie ?
hellboy,
1
@hellboy Zastanawiam się nad tym samym. Czy udało Ci się dodać kilka parametrów do parametru stanu (wartości niestandardowe i zapobieganie CSRFatakom)?
Kevin Etore
4

Jeśli jesteś w .NET, możesz zapisać parametry w Session

HttpContext.Current.Session[{varname}]

i przekierować do strony autoryzacji bez parametrów

Response.Redirect(your_uri_approved_with_no_querystring_parameters);
rufo
źródło
4
Nie skaluje się to w przypadku korzystania z farmy internetowej, takiej jak lazurowy.
wydający
3
@spender: więc sugerujesz, że dwa żądania prawie kolejno od tego samego klienta mogą być obsługiwane przez różne serwery w farmie internetowej. Jeśli tak jest, to nie jest to jedyna rzecz, na którą ma to wpływ, w zasadzie zmienna sesji nie mogła zostać użyta w tym scenariuszu do niczego. BTW: nie kłócę się - właściwie próbuję się tutaj nauczyć.
rufo
6
Jest to całkowicie możliwe, tak ... Możesz to złagodzić, zarządzając sesją za pomocą serwera sesji lub tworząc kopię zapasową sesji w bazie danych (patrz msdn.microsoft.com/en-us/library/ms178586.aspx ) lub włączając sesje trwałe na swoim module równoważenia obciążenia, aby zapewnić, że klienci zawsze wracają do tego samego węzła serwera WWW. Wszystkie opcje, o których wspomniałem, to ustawianie PITA, więc Sessionnależy unikać przechowywania dowolnego stanu klienta w IMO .
wydający
2

Możesz przekierować parametr z adresem URL jak poniżej,

Gdy otrzymasz odpowiedź od Google, możesz przekazać parametr z adresem URL,

Zobacz poniżej kod php dla tego samego,

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');

}

W powyższym przykładzie r = strona / widok jest parametrem, na który chcę uzyskać odpowiedź z parametrem

Kiran
źródło
W tym miejscu wysyłany jest parametr stanu w kodzie PHP dostarczonym przez Google. Istnieją trzy żądania wysłane po stronie serwera. Oznacza to, że końcowe żądanie nie będzie zawierało żadnych zmiennych ciągu zapytania.
lol
działa jak marzenie! Wiem, że możemy wysłać informacje w parametrze stanu, ale jeśli aplikacja oczekuje jakiejkolwiek wartości bezpośrednio jako parametr żądania, to kończy się niepowodzeniem. Podana metoda jest idealna do tego scenariusza. Dzięki!
Jayant Varshney