google oauth2 redirect_uri有几个参数

时间:2011-10-11 06:17:11

标签: oauth google-api

如何将参数添加到google oauth2 redirect_uri?

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

b的{​​{1}}是随机的。

任何人都可以提供帮助?

5 个答案:

答案 0 :(得分:211)

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

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

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

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

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

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

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

    这是base64UrlEncoding& amp;的一个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, '-_,', '+/='));
    }
    

    所以现在状态是这样的: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,
    

    对于服务器端流程,它将带有令牌: 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

答案 1 :(得分:5)

如果您使用的是.NET,则可以在Session

中保存参数
HttpContext.Current.Session[{varname}]

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

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

答案 2 :(得分:2)

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

当您收到来自Google的回复时,您可以使用网址传递参数

请参阅下面的 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 是我希望带参数的响应的参数

答案 3 :(得分:1)

在 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" }),
            });

谷歌授权完成后,从ulr返回statecode等,

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

答案 4 :(得分:0)

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

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

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

例如,随机数可以为ih4f984hf,而自定义状态为{"role": "customer"}。然后,您可以像这样存储用于该请求的补水数据:

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

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

收到响应后,您将返回state参数的值。查找它,如果它与本地存储中的值匹配,则可以使用存储的状态来处理数据。如果随机数不匹配,则该请求可能来自攻击者,因此不应进行处理。

生成随机数

请记住,随机数的性质是它只能使用一次并且必须不可预测!这里的不可预测意味着理想地是随机的,但是如果熵足够高,那么实际上是伪随机的就可以了-在Web应用中,您可能希望检查Web API Crypto的情况supported很好。

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