Redirect Google OAuth 2.0使用多个参数重定向uri

Redirect Google OAuth 2.0使用多个参数重定向uri,redirect,oauth,google-api,Redirect,Oauth,Google Api,如何将参数添加到Google OAuth 2.0重定向uri 就这样, "ih4f984hf": { "role": "customer" } redirect\u uri=http://www.example.com/redirect.html?a=b a=b的b是随机的 有人能帮忙吗 您不能向重定向uri添加任何内容,重定向uri是设置为常量的 在Oauth的应用程序设置中。 例如: 要将多个参数传递给重定向uri,请将它们存

如何将参数添加到Google OAuth 2.0
重定向uri

就这样,

"ih4f984hf": {
  "role": "customer"
}
redirect\u uri=http://www.example.com/redirect.html?a=b

a=b的
b
是随机的

有人能帮忙吗

  • 您不能向重定向uri添加任何内容,重定向uri是设置为常量的 在Oauth的应用程序设置中。 例如:

  • 要将多个参数传递给重定向uri,请将它们存储在
    状态中
    参数调用Oauth url之前,授权后的url将向重定向uri发送与
    state=状态参数

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

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

    {“a”:“b”,“c”:1}

    /二,。执行base64UrlEncode,使其URL安全->

    stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');
    
    这是base64UrlEncoding&decoding()的PHP示例:

    所以现在状态应该是:stateString->asawerwfgsg

    在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,
    
    对于服务器端流,它将与令牌一起提供: ,

    对于客户端流,它将与访问令牌一起出现在哈希中: ,

    检索状态,base64UrlDecode,json_decode,您就拥有了数据

    请在此处查看有关google OAuth 2的更多信息:


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

    HttpContext.Current.Session[{varname}]
    
    并重定向到不带参数的授权页面

    Response.Redirect(your_uri_approved_with_no_querystring_parameters);
    

    您可以使用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是一个参数,我希望对其进行参数响应,因为接受的答案确实暴露了实际数据,并且误用了
    状态
    参数,而不是坚持使用a来防止CSRF,所以我将尝试展示一种正确的方法。与其传递(读取公开)数据,还不如将其保存在本地。在请求之前将其水合物化,并在经过验证的请求之后将其重新水合物化。这里的“已验证”表示请求和响应的状态nonce匹配

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

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

    例如,nonce可以是
    ih4f984hf
    ,自定义状态可以是
    {“角色”:“客户”}
    。然后,您可以存储该请求的重新水合数据,如下所示:

    "ih4f984hf": {
      "role": "customer"
    }
    
    然后仅使用nonce
    作为请求的
    状态
    参数的值。(如果您绝对希望将nonce和数据组合到
    状态
    值中,请确保对其进行加密,并注意该值的长度是有限的!)

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

    生成当前值

    记住,nonce的本质是它只能使用一次,并且必须是不可预测的!不可预测在这里意味着理想的随机性,但实际上,如果熵足够高,伪随机是可以的——在web应用程序中,您可能需要检查哪个是非常好的

    这可能有助于进一步阅读:

    在Javascript(节点)中,可以将
    状态
    属性设置为键值对对象

    const oAuth2Client=wait new google.auth.OAuth2(
    客户ID:,
    客户机密:,
    重定向URL:,
    );
    返回等待oAuth2Client.generateAuthUrl({
    访问类型:“脱机”,
    范围:,
    state:JSON.stringify({a:y',b:z}),
    });
    
    谷歌授权完成后,它从ulr返回
    状态
    代码


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

    base64用于混淆数据以及对其进行url编码,如果您需要一点额外的“安全性”来避免混淆。@DhruvPathak perfect,我需要使用linkedin API重定向发送一个自定义参数,这与您描述的方法相同。状态参数用于在OAuth流期间防止CSRF攻击。在启动流时,必须在state参数中设置一个令牌,并且应该检查在命中重定向uri时是否在state参数中返回相同的令牌。不要做这个答案中的事情。基于会话的解决方案可能是您应该考虑的。我如何使用
    state
    param传递多个参数来重定向uri并同时防止
    CSRF
    攻击?@hellboy我也在想同样的事情。您是否向状态参数添加了多个参数(自定义值并防止
    CSRF
    攻击)?这在使用azure之类的网站场时无法扩展。@spender:因此,您的意思是,来自同一客户端的几乎按顺序的两个请求可能由网站场中的不同服务器处理。如果是这样的话,这不是唯一受影响的事情,基本上会话变量不能在该场景中用于任何事情。顺便说一句:我不是在争论-实际上是在这里学习。这是完全可能的,是的。。。您可以通过使用会话服务器管理会话或将会话备份到数据库(请参阅)或在负载平衡器上启用粘性会话来缓解此问题