google oauth2 redirect_uri mit mehreren Parametern


120

Wie füge ich dem oogle oauth2 redirect_uri Parameter hinzu?

Einfach so redirect_uri=http://www.example.com/redirect.html?a=b.

Das bvon a=bist zufällig.

Kann jemand helfen?

Antworten:


235
  1. Sie können der Umleitungs-URL nichts hinzufügen. Die Umleitungs-URL ist konstant, wie in den App-Einstellungen von Oauth festgelegt. Beispiel: http://www.example.com/redirect.html

  2. Um mehrere Parameter an Ihre Umleitungs-URL zu übergeben, müssen Sie diese state vor dem Aufrufen der Oauth-URL in den Parametern speichern. Die URL nach der Autorisierung sendet dieselben Parameter an Ihre Weiterleitungs-URL wie state=THE_STATE_PARAMETERS

Gehen Sie für Ihren Fall folgendermaßen vor:

/ 1. Erstellen Sie eine JSON-Zeichenfolge Ihrer Parameter ->

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

/ 2. Führen Sie einen base64UrlEncode aus, um die URL sicher zu machen ->

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

Dies ist ein PHP-Beispiel für 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, '-_,', '+/='));
}

Jetzt wäre state so etwas wie: stateString -> asawerwerwfgsg,

Übergeben Sie diesen Status in der OAuth-Autorisierungs-URL:

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,

Für den serverseitigen Ablauf wird ein Token mitgeliefert: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Für den clientseitigen Ablauf wird er zusammen mit dem Zugriffstoken im Hash angezeigt: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Rufen Sie den Status ab, base64UrlDecode it, json_decode it und Sie haben Ihre Daten.

Weitere Informationen zu Google OAuth 2 finden Sie hier:

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


base64 wird verwendet, um die Daten zu verschleiern und sie per URL zu verschlüsseln, wenn Sie ein wenig zusätzliche "Sicherheit" durch Dunkelheit benötigen.
Ricosrealm

@DhruvPathak perfekt, ich musste einen benutzerdefinierten Parameter mit Linkedin API Redirect zurücksenden und es ist die gleiche Methode, die Sie beschrieben haben.
Ericics

5
Der Statusparameter wird verwendet, um CSRF-Angriffe während des OAuth-Flusses zu verhindern. Sie müssen beim Initiieren des Flusses ein Token im Statusparameter festlegen und prüfen, ob Sie dasselbe Token im Statusparameter zurückerhalten, wenn Ihr redirect_uri getroffen wird. Tun Sie nicht, was in dieser Antwort getan wird. Eine sitzungsbasierte Lösung ist wahrscheinlich das, worauf Sie achten sollten.
Rahim

2
Wie kann ich mit stateparam auf mehrere Parameter übergeben uri umleiten und zu verhindern CSRFAngriff zur gleichen Zeit ?
Hellboy

1
@hellboy Ich frage mich das gleiche. Haben Sie es geschafft, dem Statusparameter mehrere Parameter hinzuzufügen (benutzerdefinierte Werte und CSRFAngriffe verhindern )?
Kevin Etore

4

Wenn Sie sich in .NET befinden, können Sie die Parameter in der Sitzung speichern

HttpContext.Current.Session[{varname}]

und leiten Sie ohne Parameter zur Autorisierungsseite weiter

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
Dies wird bei Verwendung einer Webfarm wie Azure nicht skaliert.
Spender

3
@spender: Sie implizieren also, dass zwei fast aufeinanderfolgende Anforderungen vom selben Client möglicherweise von verschiedenen Servern in der Webfarm verarbeitet werden. Wenn dies der Fall ist, ist dies nicht das einzige, was betroffen ist. Grundsätzlich konnte die Sitzungsvariable in diesem Szenario für nichts verwendet werden. Übrigens: Ich streite nicht - ich versuche tatsächlich hier zu lernen.
Rufo

6
Es ist durchaus möglich, ja ... Sie können dies abmildern, indem Sie die Sitzung mit einem Sitzungsserver verwalten oder die Sitzung in der Datenbank sichern (siehe msdn.microsoft.com/en-us/library/ms178586.aspx ) oder Sticky-Sitzungen aktivieren auf Ihrem Load-Balancer, um sicherzustellen, dass Clients immer zum gleichen Webserver-Knoten zurückkehren. Alle Optionen, die ich erwähnt habe, sind eine PITA, die eingerichtet werden muss. Daher Sessionsollte vermieden werden, dass IMO einen Client-Status speichert .
Spender

2

Sie können Parameter mit URL wie folgt umleiten:

Wenn Sie eine Antwort von Google erhalten, können Sie Parameter mit URL übergeben,

Siehe unten PHP- Code für das gleiche,

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

}}

Im obigen Beispiel ist r = Seite / Ansicht ein Parameter, auf den ich die Antwort mit Parameter möchte


Hier wird der Statusparameter im von Google bereitgestellten PHP-Code gesendet. Es werden drei Anfragen serverseitig gestellt. Dies bedeutet, dass die endgültige Anforderung überhaupt keine Abfragezeichenfolgenvariablen enthält.
lol

klappt wunderbar! Ich weiß, dass wir Informationen im Statusparameter senden können, aber wenn die Anwendung einen Wert direkt als Anforderungsparameter erwartet, schlägt dies fehl. Die von Ihnen angegebene Methode ist perfekt für dieses Szenario. Vielen Dank!
Jayant Varshney
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.