eas*_*son 113 oauth google-api
如何在google oauth2 redirect_uri中添加参数?
就像这样redirect_uri=http://www.example.com/redirect.html?a=b.
该b的a=b是随机的.
有人可以帮忙吗?
Dhr*_*hak 223
您无法向重定向uri添加任何内容,重定向uri在Oauth的应用程序设置中设置为常量.例如:http://www.example.com/redirect.html
要将多个参数传递给重定向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
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 。
对于进一步阅读,这可能会有所帮助:
| 归档时间: |
|
| 查看次数: |
83662 次 |
| 最近记录: |