Réponses:
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
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:
state
param pour passer plusieurs paramètres pour rediriger l'URI et pour empêcher une CSRF
attaque en même temps ?
CSRF
attaques)?
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);
Session
doit être évité.
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
Puisque la réponse acceptée expose les données réelles et utilise mal le state
paramè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 ih4f984hf
et 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 state
paramètre de la requête. (Si vous souhaitez absolument combiner le nonce et les données dans la state
valeur, 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 state
paramè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: