google oauth2 redirect_uri avec plusieurs paramètres

120

Comment ajouter un paramètre au google oauth2 redirect_uri?

Juste comme ça redirect_uri=http://www.example.com/redirect.html?a=b.

Le bde a=best aléatoire.

Quelqu'un peut-il aider?

Eason
la source

Réponses:

236
  1. Vous ne pouvez rien ajouter à l'URI de redirection, l'URI de redirection est constant tel que défini dans les paramètres de l'application d'Oauth. par exemple : http://www.example.com/redirect.html

  2. Pour passer plusieurs paramètres à votre uri de redirection, faites-les stocker dans le state paramètre avant d'appeler l'url Oauth, l'url après autorisation enverra les mêmes paramètres à votre uri de redirection que state=THE_STATE_PARAMETERS

Donc, pour votre cas, faites ceci:

/1. créer une chaîne json de vos paramètres ->

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

/ 2. faire un base64UrlEncode, pour rendre l'URL sûre ->

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

Voici un exemple PHP de 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, '-_,', '+/='));
}

Alors maintenant, l'état serait quelque chose comme: stateString -> asawerwerwfgsg,

Transmettez cet état dans l'URL d'autorisation 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,

Pour le flux côté serveur, il sera accompagné d'un jeton: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Pour le flux côté client, il viendra dans le hachage avec le jeton d'accès: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Récupérez l'état, base64UrlDecode, json_decode et vous avez vos données.

En savoir plus sur google OAuth 2 ici:

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

DhruvPathak
la source
base64 est utilisé pour masquer les données ainsi que pour l'encoder par URL, si vous avez besoin d'un peu de «sécurité» supplémentaire par l'obscurité.
ricosrealm le
@DhruvPathak parfait, j'avais besoin de renvoyer un paramètre personnalisé avec la redirection API LinkedIn et c'est la même méthode que vous avez décrite.
ericsicons
6
Le paramètre state est utilisé pour empêcher les attaques CSRF pendant le flux OAuth. Vous devez définir un jeton dans le paramètre d'état lors du lancement du flux et vous devez vérifier si vous récupérez le même jeton dans le paramètre d'état lorsque votre redirect_uri est atteint. Ne faites pas ce qui est fait dans cette réponse. Une solution basée sur une session est probablement ce que vous devriez regarder.
Rahim
2
Comment puis-je utiliser stateparam pour passer plusieurs paramètres pour rediriger l'URI et pour empêcher une CSRFattaque en même temps ?
hellboy
1
@hellboy Je me demande la même chose. Avez-vous réussi à ajouter plusieurs paramètres au paramètre d'état (valeurs personnalisées et prévention des CSRFattaques)?
Kevin Etore
4

Si vous êtes en .NET, vous pouvez enregistrer les paramètres dans la session

HttpContext.Current.Session[{varname}]

et rediriger vers la page d'autorisation sans paramètres

Response.Redirect(your_uri_approved_with_no_querystring_parameters);
rufo
la source
4
Cela n'est pas mis à l'échelle lors de l'utilisation d'un site Web tel qu'azure.
dépenser
3
@spender: vous sous-entendez donc que deux demandes presque en séquence du même client peuvent être traitées par différents serveurs dans le webfarm. Si tel est le cas, ce n'est pas la seule chose affectée, fondamentalement, la variable Session ne peut pas être utilisée dans ce scénario pour quoi que ce soit. BTW: Je ne discute pas - j'essaie réellement d'apprendre ici.
rufo
6
C'est tout à fait possible, oui ... Vous pouvez atténuer cela en gérant la session avec un serveur de session ou en sauvegardant la session dans la base de données (voir msdn.microsoft.com/en-us/library/ms178586.aspx ), ou pour activer les sessions persistantes sur votre équilibreur de charge pour garantir que les clients reviennent toujours sur le même nœud de serveur Web. Toutes les options que j'ai mentionnées sont un PITA à configurer, donc l'OMI, le stockage de tout état client Sessiondoit être évité.
dépensier
2

Vous pouvez rediriger le paramètre avec l'url comme ci-dessous,

Lorsque vous obtenez une réponse de google, vous pouvez passer le paramètre avec l'URL,

Voir ci-dessous le code php pour le même,

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

}

Dans l'exemple ci-dessus r = page / vue est le paramètre sur lequel je veux la réponse avec le paramètre

Kiran
la source
C'est là que le paramètre d'état est envoyé dans le code PHP fourni par Google. Il y a trois demandes faites côté serveur. Cela signifie que la requête finale ne contiendra aucune variable de chaîne de requête.
lol
fonctionne comme un charme! Je sais que nous pouvons envoyer des informations dans le paramètre d'état, mais si l'application attend une valeur directement en tant que paramètre de requête, cela échoue. La méthode que vous avez fournie est parfaite pour ce scénario. Merci!
Jayant Varshney
0

Puisque la réponse acceptée expose les données réelles et utilise mal le stateparamètre au lieu de s'en tenir à un nonce pour se protéger contre CSRF, je vais essayer de montrer une méthode appropriée. Plutôt que de transmettre (lire exposer ) des données, elles doivent rester locales. Hydratez-le avant la demande et réhydratez-le après une demande validée . «Validé» signifie ici que l'état-nonce de la demande et de la réponse correspond.

Vous avez besoin d'une sorte de stockage temporaire côté client . Par exemple, pour le SPA ou les sites Web généraux, gardez-le en état ou utilisez le stockage local du navigateur, une session (ou un cookie signé ). Pour les applications mobiles, ils doivent utiliser la mémoire ou tout autre stockage local.

Avant d'envoyer la requête, générez un nonce (voir ci-dessous) qui sera utilisé comme state paramètre de la requête. Stockez le nonce avec l'état personnalisé (par exemple un json) dans le stockage local.

Par exemple, le nonce pourrait être ih4f984hfet l'état personnalisé {"role": "customer"}. Ensuite, vous pouvez stocker des données pour la réhydratation pour cette demande comme ceci:

"ih4f984hf": {
  "role": "customer"
}

Utilisez ensuite uniquement le nonce comme valeur pour le stateparamètre de la requête. (Si vous souhaitez absolument combiner le nonce et les données dans la statevaleur, assurez-vous de le chiffrer et sachez que la longueur de la valeur est limitée!)

Lorsque vous recevez une réponse, vous récupérez la valeur du stateparamètre. Recherchez-le et s'il correspond à la valeur du stockage local, vous pouvez traiter les données en utilisant l'état stocké. Si les nonces ne correspondent pas, la requête provient potentiellement d'un attaquant et ne doit pas être traitée.

Générer le nonce

Rappelez-vous que la nature d'un nonce est qu'il n'est utilisé qu'une seule fois et doit être imprévisible! Imprévisible ici signifie idéalement aléatoire, mais pratiquement pseudo-aléatoire est correct si l'entropie est suffisamment élevée - dans les applications Web, vous voudrez peut-être vérifier Web API Crypto qui est assez bien pris en charge .

Pour plus d'informations, cela peut être utile:

Coincé
la source