Google OAuth 2.0 redirect_uri 带有几个参数

如何向 Google OAuth 2.0 redirect_uri添加参数?

就像这样:

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

a=bb是随机的。

有人能帮忙吗?

121678 次浏览
  1. 您不能向重定向 uri 添加任何内容,重定向 uri 是常量 在 Oauth 的应用程序设置中。 例如: http://www.example.com/redirect.html

  2. 要向重定向 uri 传递几个参数,请将它们存储在 state中 参数在调用 Oauth url 之前,经过授权的 url 将向您的重定向 uri 发送与 state=THE_STATE_PARAMETERS

因此,对于你的情况,这样做:

/1. 创建参数的 json 字符串->

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

/2. 执行 base64UrlEncode,使其 URL 安全->

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

这是一个关于 base64UrlEncoding & decding (http://en.wikipedia.org/wiki/Base64#URL_applications)的 PHP 示例:

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


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

所以现在 state 类似于: 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,

对于服务器端流,它将附带令牌: Http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg

对于客户端流,它将与访问令牌一起出现在 hash 中: Http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg

检索状态,base64UrlDecode 它,json _ decode 它,然后就有了数据。

点击这里查看更多关于 google OAuth 2的信息:

Http://code.google.com/apis/accounts/docs/oauth2.html

如果你在.NET 中,你可以在会话中保存参数

HttpContext.Current.Session[{varname}]

并重定向到没有参数的授权页

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

您可以使用下面的 url 重定向参数,

当你从 google 得到响应时,你可以用 url 传递参数,

请参阅下面的 我不知道代码,

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

}

在上面的例子中,R = 页面/视图是一个参数,我希望响应中有一个参数

由于接受的答案确实暴露了实际数据,并且错误地使用了 state参数,而没有坚持使用 马上来防止 CSRF,因此我将尝试展示一个适当的方法。它应该保持在本地,而不是 传球(读取 暴露)数据。在请求前补充水分,在 有效请求后补充水分。这里的“验证”意味着请求和响应的状态立即匹配。

你需要某种 临时客户端存储器。例如,对于 SPA 或者一般网站来说,保持它的状态或者使用浏览器的 localStorage,一个会话(或者一个 签了 cookie)。对于移动应用程序,他们应该使用内存或任何其他本地存储。

在发送请求之前,生成一个 nonce (见下文) ,该 nonce 将用作请求的 state参数。将 nonce 与自定义状态(例如 json)一起存储在本地存储中。

例如,nonce 可以是 ih4f984hf和自定义状态 {"role": "customer"}。然后你可以像下面这样存储再水合的数据:

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

然后使用 只有一次作为请求的 state参数的值。(如果您绝对想要将 nonce 和数据合并到 state值中,那么一定要对它进行加密,并注意该值的长度是有限的!)

当接收到响应时,将返回 state参数的值。查找它,如果它与本地存储中的值匹配,则可以使用存储状态处理数据。如果 nonce 不匹配,则可能来自攻击者的请求不应该被处理。

正在生成 Nonce

请记住,立刻行动的本质是它只能使用一次,而且必须是不可预测的!不可预测在这里意味着理想的随机,但实际上伪随机是可以的,如果熵足够高-在网络应用程序中,你可能要检查 Web API 加密,这是 支持相当好。

对于进一步的阅读,这可能是有帮助的:

在 Javascript (Node)中,可以将 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" }),
});

在谷歌授权完成,它返回的 statecode等从 ulr,

const params = JSON.parse(state); // { a: "y", b: "z" }