如何向Google OAuth 2.0的redirect_uri
添加参数?
像这样:
redirect_uri=http://www.example.com/redirect.html?a=b
a=b
中的 b
是随机的。
有人可以帮忙吗?
如何向Google OAuth 2.0的redirect_uri
添加参数?
像这样:
redirect_uri=http://www.example.com/redirect.html?a=b
a=b
中的 b
是随机的。
有人可以帮忙吗?
无法将任何内容添加到重定向URI中,重定向URI是OAuth应用程序设置中已设定的常量。
要将多个参数传递给您的重定向URI,请在调用OAuth URL之前将它们存储在state
参数中,
授权后的URL将以相同的参数state=THE_STATE_PARAMETERS
发送到您的重定向URI。
因此,对于您的情况,请执行以下操作:
/1. 创建您的参数的JSON字符串->
{ "a" : "b" , "c" : 1 }
/2. 进行base64Url编码,使其URL安全->
stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');
这是一个 PHP 的 base64Url 编码和解码示例 (http://en.wikipedia.org/wiki/Base64#URL_applications):
function base64UrlEncode($inputStr)
{
return strtr(base64_encode($inputStr), '+/=', '-_,');
}
function base64UrlDecode($inputStr)
{
return base64_decode(strtr($inputStr, '-_,', '+/='));
}
现在状态可能是这样的:stateString -> asawerwerwfgsg,
将此状态传递到OAuth授权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,
对于服务器端流程,它将随token一起发送:
http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg,对于客户端流程,它将在哈希中随access token一起发送:
http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg,检索状态,进行base64Url解码,然后进行json_decode,你就有了数据。
更多关于Google OAuth 2的信息,请参见:
由于被接受的答案暴露了实际数据并误用了state
参数而不是坚持使用随机数来防止CSRF攻击,我将尝试展示正确的方法。不要传递(请理解为暴露)数据,应该将其保留在本地,在请求之前进行数据注水,然后在验证过的请求之后进行脱水。这里的“验证过的”意味着请求和响应的状态码必须匹配。
你需要一些临时的客户端存储。例如对于SPA或常规网站,可以将其保留在state中或使用浏览器的localStorage、会话(或带有签名的cookie)。对于移动应用程序,它们应该使用内存或任何其他本地存储。
在发送请求之前生成一个随机数(参见下文),该随机数将用作请求的state
参数。将随机数与自定义状态(例如json)一起存储在本地存储中。
例如,随机数可以是ih4f984hf
,自定义状态可以是{"role": "customer"}
。然后,您可以像这样存储用于该请求的数据:
"ih4f984hf": {
"role": "customer"
}
然后将仅限nonce作为请求的state
参数的值。(如果您想要将nonce和数据组合成state
值,请确保加密它并注意值的长度有限!)
在接收到响应时,您会获得state
参数的值。查找它,如果它与本地存储中的值匹配,则可以使用存储的状态处理数据。如果nonce不匹配,则该请求可能来自攻击者,不应处理。
生成nonce
记住nonce的本质是仅限一次使用,必须是不可预测的!这里的不可预测意味着理想情况下是随机的,但实际上如果熵足够高,则准备伪随机也可以-在web应用程序中,您可能希望检查Web API Crypto,它被相当好地支持。
更多阅读材料:
如果你正在使用.NET,你可以将参数保存在Session中。
HttpContext.Current.Session[{varname}]
Response.Redirect(your_uri_approved_with_no_querystring_parameters);
state
属性设置为键值对对象。 const oAuth2Client = await new google.auth.OAuth2(
clientId: <clientId>,
clientSecret: <clientSecret>,
redirectUrl: <redirectUrl>,
);
return await oAuth2Client.generateAuthUrl({
access_type: "offline",
scope: <scopes>,
state: JSON.stringify({ a: "y", b: "z" }),
});
const params = JSON.parse(state); // { a: "y", b: "z" }
您可以通过以下方式重定向URL参数:
当您从谷歌获得响应时,可以通过URL传递参数。
请参见以下相同的php代码:
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');
{
"role": "customer",
"nonce": "ih4f984hf",
}
state
参数来传递多个参数到重定向 URI 并同时防止CSRF
攻击? - hellboystate: JSON.stringify({ a: "b", b: "c" })
。 - kheengz