2011-10-11 8 views

risposta

174
  1. Non è possibile aggiungere nulla alla uri reindirizzamento, reindirizzare URI è costante come stabilito nelle impostazioni dell'applicazione di OAuth. esempio: http://www.example.com/redirect.html

  2. Per passare diversi parametri al vostro uri reindirizzamento, li hai salvati nella state parametro prima di chiamare Oauth URL, l'URL dopo l'autorizzazione invierà gli stessi parametri per la vostra URI reindirizzamento come state=THE_STATE_PARAMETERS

Quindi per il tuo caso, fare questo:

/1. creare una stringa JSON dei vostri parametri ->

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

/2. fare un base64UrlEncode, per renderlo sicuro URL ->

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

questo è un esempio PHP di base64UrlEncoding & decodifica (http://en.wikipedia.org/wiki/Base64#URL_applications):

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

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

Così ora lo stato sarebbe qualcosa di simile: stateString -> asawerwerwfgsg ,

passare questo stato nel OAuth URL autorizzazione:

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 lato server di flusso che verrà con token: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg,

Per lato client flusso arriverà nel hash con accesso token: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg,

recuperare lo stato, base64UrlDecode esso, json_decode e hai i tuoi dati.

vedere di più su google OAuth 2 qui:

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

+3

curioso: perché Base64 e non basta fare un'urllib.urlencode? –

+0

base64 è usato per offuscare i dati e url lo codifica, se fosse necessario un po 'di extra' sicurezza 'attraverso l'oscurità. – ricosrealm

+0

@DhruvPathak perfetto, avevo bisogno di inviare un parametro personalizzato indietro con il reindirizzamento API linkedin ed è lo stesso metodo che hai descritto. – ericsicons

5

Se siete in.NET è possibile salvare i parametri nella Sessione

HttpContext.Current.Session[{varname}] 

e reindirizzare alla pagina di autorizzazione senza parametri

Response.Redirect(your_uri_approved_with_no_querystring_parameters); 
+4

Questo non si scala quando si utilizza un webfarm come l'azzurro. – spender

+3

@spender: in questo modo si suppone che due richieste quasi in sequenza dallo stesso client possano essere gestite da server diversi nella webfarm. Se questo è il caso, questa non è l'unica cosa colpita, fondamentalmente la variabile Session non può essere usata in quello scenario per nulla. A proposito: non sto discutendo - in realtà sto cercando di imparare qui. – rufo

+6

È completamente possibile, sì ... È possibile attenuarlo gestendo la sessione con un server di sessione o una sessione di backup sul database (consultare http://msdn.microsoft.com/en-us/library/ms178586.aspx), o per abilitare sessioni persistenti sul bilanciamento del carico per garantire che i client ritornino sempre allo stesso nodo del server web. Tutte le opzioni che ho menzionato sono un PITA da configurare, quindi IMO, memorizzando qualsiasi stato client in 'Session' dovrebbe essere evitato. – spender

1

È possibile reindirizzare parametro con URL, qui di seguito,

Quando si ottiene risposta da Google di quello che puoi passare parametro con url,

Vedi sotto php codice 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'); 

}

Nel precedente esempio r = pagina/vista è parametro su cui voglio la risposta con il parametro

+0

Qui è dove viene inviato il parametro di stato nel codice PHP fornito da google. Ci sono tre richieste fatte lato server. Ciò significa che la richiesta finale non avrà alcuna variabile di stringa di query. – lol

Problemi correlati