带有多个参数的Google oauth2 redirect_uri


120

如何向Google oauth2 redirect_uri添加参数?

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

ba=b是随机的。

有人可以帮忙吗?

Answers:


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

  2. 要将多个参数传递给您的重定向uri,请state 在调用Oauth网址之前将其存储在参数中,授权后的网址将向您的重定向uri发送相同的参数 state=THE_STATE_PARAMETERS

因此,对于您的情况,请执行以下操作:

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

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

/ 2。做一个base64UrlEncode,以使其URL安全->

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

这是base64UrlEncoding和解码(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, '-_,', '+/='));
}

所以现在状态将类似于: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

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


如果您需要通过隐蔽性获得一些额外的“安全性”,则可以使用base64对数据进行模糊处理以及对其进行url编码。
ricosrealm 2013年

@DhruvPathak完美,我需要使用linkedin API重定向发送回一个自定义参数,这与您描述的方法相同。
ericsicons 2015年

5
state参数用于防止OAuth流期间的CSRF攻击。启动流时,必须在state参数中设置一个标记,并且应该检查在您命中redirect_uri时是否在state参数中获得了相同的标记。不要做这个答案所做的事情。基于会话的解决方案可能是您应该考虑的。
拉希姆

2
如何使用stateparam传递几个参数来重定向uri并防止同时发生CSRF攻击?
hellboy

1
@hellboy我在想同样的事情。您是否设法向状态参数添加了几个参数(自定义值并防止了CSRF攻击)?
凯文·埃托尔

4

如果您使用的是.NET,则可以将参数保存在Session中

HttpContext.Current.Session[{varname}]

并重定向到不带参数的授权页面

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
当使用网络农场(例如天蓝色)时,这不会缩放。
支出者2014年

3
@spender:因此,您暗示来自同一客户端的几乎两个请求可能由Webfarm中的不同服务器处理。如果真是这样,这不是唯一受到影响的东西,基本上Session变量在那种情况下不能用于任何事情。顺便说一句:我不是在争论-实际上是想在这里学习。
rufo 2014年

6
完全有可能,是的...您可以通过管理会话服务器的会话或将会话回退到数据库(请参见msdn.microsoft.com/en-us/library/ms178586.aspx)来缓解这种情况,或启用粘性会话在您的负载均衡器上,以确保客户端始终返回同一Web服务器节点。我提到的所有选项都是要设置的PITA,因此Session应避免将任何客户端状态存储在IMO中。
支出者2014年

2

您可以使用url重定向参数,如下所示:

当您收到Google的回复时,可以通过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');

}

在上面的示例中,r = page / view是参数,我要在该参数上使用参数


这是在Google提供的PHP代码中发送state参数的地方。服务器端发出了三个请求。这意味着最终请求将根本没有任何查询字符串变量。
哈哈2015年

奇迹般有效!我知道我们可以在状态参数中发送信息,但是如果应用程序直接期望任何值作为请求参数,那么它将失败。您提供的方法非常适合这种情况。谢谢!
Jayant Varshney,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.