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?

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


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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.