google oauth2 redirect_uri con diversi parametri


120

Come aggiungere un parametro a google oauth2 redirect_uri?

Proprio così redirect_uri=http://www.example.com/redirect.html?a=b.

Il bdi a=bè casuale.

Qualcuno può aiutare?

Risposte:


235
  1. Non è possibile aggiungere nulla all'URI di reindirizzamento, l'URI di reindirizzamento è costante come impostato nelle impostazioni dell'app di Oauth. ad esempio: http://www.example.com/redirect.html

  2. Per passare diversi parametri al tuo uri di reindirizzamento, memorizzali nel state parametro prima di chiamare l'URL Oauth, l'URL dopo l'autorizzazione invierà gli stessi parametri al tuo uri di reindirizzamento come state=THE_STATE_PARAMETERS

Quindi per il tuo caso, fai questo:

/ 1. crea una stringa json dei tuoi parametri ->

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

/ 2. esegui un base64UrlEncode, per renderlo sicuro per l'URL ->

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

Questo è un esempio PHP di 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, '-_,', '+/='));
}

Quindi ora lo stato sarebbe qualcosa del tipo: stateString -> asawerwerwfgsg,

Passa questo stato nell'URL di autorizzazione 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,

Per il flusso lato server verrà fornito con il token: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Per il flusso lato client arriverà nell'hash insieme al token di accesso: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Recupera lo stato, base64UrlDecode it, json_decode it, e hai i tuoi dati.

Vedi di più su Google OAuth 2 qui:

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


base64 è usato per offuscare i dati così come l'URL codificarli, se avessi bisogno di un po 'di "sicurezza" extra attraverso l'oscurità.
ricosrealm

@DhruvPathak perfetto, avevo bisogno di inviare un parametro personalizzato indietro con il reindirizzamento dell'API di LinkedIn ed è lo stesso metodo che hai descritto.
Ericsicons

5
Il parametro state viene utilizzato per prevenire attacchi CSRF durante il flusso OAuth. Devi impostare un token nel parametro state quando inizi il flusso e dovresti controllare se ottieni indietro lo stesso token nel parametro state quando il tuo redirect_uri viene colpito. Non fare ciò che viene fatto in questa risposta. Una soluzione basata sulla sessione è probabilmente ciò che dovresti guardare.
Rahim

2
Come posso usare stateparam per passare diversi parametri per reindirizzare uri e per prevenire l' CSRFattacco allo stesso tempo ?
hellboy

1
@ Shellboy mi chiedo la stessa cosa. Sei riuscito ad aggiungere diversi parametri al parametro di stato (valori personalizzati e prevenzione degli CSRFattacchi)?
Kevin Etore

4

Se sei in .NET puoi salvare i parametri in Session

HttpContext.Current.Session[{varname}]

e reindirizza alla pagina di autorizzazione senza parametri

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
Questo non scala quando si usa una webfarm come Azure.
spender

3
@spender: quindi implichi che due richieste quasi in sequenza dallo stesso client potrebbero essere gestite da server diversi nella webfarm. Se è così, questa non è l'unica cosa interessata, in pratica la variabile Session non può essere utilizzata in quello scenario per nulla. BTW: non sto discutendo, in realtà sto cercando di imparare qui.
rufo

6
È del tutto possibile, sì ... Puoi mitigare questo problema gestendo la sessione con un server di sessione o eseguendo il backup della sessione nel database (vedi msdn.microsoft.com/en-us/library/ms178586.aspx ) o abilitando le sessioni permanenti sul tuo sistema di bilanciamento del carico per garantire che i client tornino sempre allo stesso nodo del server web. Tutte le opzioni che ho menzionato sono un PITA da configurare, quindi IMO, la memorizzazione di qualsiasi stato del client Sessiondovrebbe essere evitata.
spender

2

Puoi reindirizzare il parametro con l'URL come di seguito,

Quando ricevi una risposta da Google, puoi passare il parametro con l'URL,

Vedi sotto il codice php per lo stesso,

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

}

Nell'esempio sopra r = page / view è il parametro su cui voglio la risposta con il parametro


Qui è dove il parametro state viene inviato nel codice PHP fornito da Google. Ci sono tre richieste fatte lato server. Ciò significa che la richiesta finale non avrà affatto variabili della stringa di query.
lol

funziona come un fascino! So che possiamo inviare informazioni nello stato param, ma se l'applicazione si aspetta un valore direttamente come parametro della richiesta, non riesce. Il metodo che hai fornito è perfetto per questo scenario. Grazie!
Jayant Varshney
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.