【问题标题】:How to make redirect_url containing data to oauth Google如何使包含数据的redirect_url到oauth Google
【发布时间】:2019-01-28 11:05:22
【问题描述】:

我很难实现身份验证流程。

以下流程正在运行: 从客户端,我正在重定向到服务端:

document.location.href = URI.UriSignIn

在服务端,我正在重定向到 Google 的授权服务器:

const baseURI = "https://accounts.google.com/o/oauth2/v2/auth?";
  const redirect_uri =
    `redirect_uri=http://${process.env.URIBASE}:8081/callBackGoogle`;
  const prompt = "&prompt=consent";
  const reponse_type = "&response_type=code";
  const client_id =
    "&client_id=" + process.env.CLIENT_ID;
  const scope =
    "&scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile";

  res.writeHead(302, {
    'Access-Control-Allow-Origin': '*',
    Location:
      baseURI +
      redirect_uri +
      prompt +
      reponse_type +
      client_id +
      scope
  });

它正在工作,但现在我正在尝试将“UUID”添加到从客户端到服务器端的重定向,以便客户端稍后可以像这样检索他的 JWT:

axios.get(URI.UriSignIn, {
    headers: {
        'token-client': uuid()
    }
})

使用相同的代码服务端,我收到以下错误

我找到了一种解决方法,将重定向拆分为 2 个请求,一个用于发送 UUID,另一个用于重定向,但这不是最安全的做法(出于安全原因)

【问题讨论】:

  • axios.get 不是重定向,而是 ajax 调用。看看使用state参数,也许对你有帮助。
  • 是的,我知道,但这正是我想将 UUID 发送到服务器的原因,以便它可以使用“state”参数中的 UUID 发送到 Google 的授权服务器。稍后在创建 JWT 后,客户端可以通过发送此特定 UUID 来检索
  • 另外我想将数据发送到服务器(也许我应该使用 POST?)并从服务器端重定向到 Google 的授权服务器
  • 我已经发布了您问题的答案。如果您还有其他问题,我建议您,例如“我该如何......?”你应该把它作为一个新问题发布。这有助于保持整洁,对未来的开发人员有用。

标签: cors google-oauth axios


【解决方案1】:

所问问题的答案是 OP 正在使用 ajax/rest 调用对应该是重定向目标的 URL。

所以,从广义上讲,而不是

axios.get(url)

用户应该这样做

location.href=url

【讨论】:

  • location.href=url + '/uuid' 就像一个魅力,另一种选择只是使用 cookie 或会话(cookie 应该足够)所以一切都在管理服务器端
  • 酷。小心依赖会话。 REST 是无状态的,有时您的应用程序会增长并且您将其移动到多服务器配置中。这就是 Google OAuth 提供 state 参数的原因。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 2011-06-27
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2011-11-23
相关资源
最近更新 更多