google oauth2 redirect_uri有几个参数

eas*_*son 113 oauth google-api

如何在google oauth2 redirect_uri中添加参数?

就像这样redirect_uri=http://www.example.com/redirect.html?a=b.

ba=b是随机的.

有人可以帮忙吗?

Dhr*_*hak 223

  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 }');
Run Code Online (Sandbox Code Playgroud)

这是base64UrlEncoding和解码的PHP示例(http://en.wikipedia.org/wiki/Base64#URL_applications):

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

function base64UrlDecode($inputStr)
{
    return base64_decode(strtr($inputStr, '-_,', '+/='));
}
Run Code Online (Sandbox Code Playgroud)

所以现在状态会是这样的:stateString - > asawerwerwfgsg,

在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,
Run Code Online (Sandbox Code Playgroud)

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

对于客户端流程,它将与访问令牌一起包含在哈希中: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

  • state参数用于防止OAuth流期间的CSRF攻击.您必须在启动流时在state参数中设置一个标记,并且当您的redirect_uri被命中时,您应该检查是否在state参数中返回相同的标记.不要做这个答案所做的事情.基于会话的解决方案可能就是您应该关注的内容. (5认同)
  • 好奇:为什么base64而不只是做一个urllib.urlencode? (3认同)
  • 如何使用`state` param传递几个参数来重定向uri并同时防止`CSRF`攻击**? (2认同)

Stu*_*uck 20

由于接受的答案确实暴露了实际数据并滥用了state参数,而不是坚持使用随机数来防止 CSRF,所以我将尝试展示一种正确的方法。它不应该传递(读取暴露)数据,而应该保留在本地。在请求之前将其水化,并在验证请求后将其重新水化。这里的“已验证”意味着请求和响应的状态随机数匹配。

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

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

例如,随机数可以是ih4f984hf,自定义状态{"role": "customer"}。然后,您可以存储该请求的补水数据,如下所示:

"ih4f984hf": {
  "role": "customer"
}
Run Code Online (Sandbox Code Playgroud)

然后仅使用随机数作为state请求参数的值。(如果您绝对想将随机数和数据合并到值中,state请务必对其进行加密,并注意该值的长度是有限的!)

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

生成随机数

请记住,随机数的本质是它仅使用一次并且必须是不可预测的!这里的不可预测意味着理想情况下是随机的,但如果熵足够高,实际上伪随机是可以的 - 在 Web 应用程序中,您可能需要检查支持得很好的Web API Crypto 。

对于进一步阅读,这可能会有所帮助: