5

我正在创建一个带有 React 前端和 Java Spring Boot 后端的应用程序。

我的登录流程如下所示:

  1. 用户在前端点击登录
  2. 用户被重定向到我服务器上的 Google Oauth 授权端点
  3. OAuth 2.0 授权流程发生:用户被重定向到 Google 并登录。Google 与我的服务器交互,首先交换授权代码,然后交换 JWT 访问令牌。我的服务器现在拥有用户的 JWT 访问令牌。
  4. 问题:我现在需要将 JWT 令牌重定向到我的 React 前端,以便每次用户想要请求访问我服务器上的受保护资源时都可以保存和使用令牌。

现在是否有将令牌从服务器重定向到我的 React 前端的行业标准/最佳实践?

Stack Overflow 上有关于这个主题的类似问题,但是它们至少有 3 年的历史,例如如何在服务器身份验证后为前端提供 JSON Web 令牌? 从那时起,隐式流已被弃用,不再建议将 JWT 存储在本地存储中,并且https://datatracker.ietf.org/doc/html/rfc6750明确不鼓励在重定向 URL 中将不记名令牌传递到前端。

我想知道是否有人知道这个问题的最新解决方案。

4

2 回答 2

2

对于基于浏览器的应用程序的 OAuth 2.0 有一个 IETF BCP 草案 - 请参见此处。基本上,它与使用带有 PKCE(代码交换证明密钥)的授权码的原生移动应用程序非常相似。

FWIW 我同意不应该使用隐式流,但是 IMO 你不应该在没有PKCE 的情况下使用授权代码流,因为这个流是用于服务器端呈现的 Web 应用程序。

编辑 - Auth0(市场上最流行的 CIAM 解决方案之一)文档说同样的话 - 见这里

如果客户端是单页应用程序 (SPA),即使用 JavaScript 等脚本语言在浏览器中运行的应用程序,则有两个授权选项:带有代码交换证明密钥 (PKCE) 的授权代码流和带有代码交换证明密钥的隐式流表单发布。在大多数情况下,我们建议使用带有 PKCE 的授权代码流...

于 2021-07-29T13:25:00.610 回答
0

不。

您似乎在这里混合了两个问题。

首先,您想在您的 SPA 中使用 OIDC 进行身份验证。为此,您将使用带有 PKCE 的 OIDC 隐式流或授权代码流。

其次,您希望将身份验证委托给 google,而不是自己进行。基本上这被称为联合——您信任外部身份提供者。

完整的版本将是设置您自己的身份提供者服务器(例如 keycloak)并在那里配置联合到谷歌。您的 SPA 会针对您的身份提供者启动 OIDC,甚至不知道谷歌进行了身份验证。如有必要,您还可以轻松添加更多身份提供者(例如 facebook)。

一个更简单的解决方法是从您的 SPA 直接启动 OIDC 登录到 Google。这样,您的 SPA 将直接从 google 接收令牌,并且您需要保护自己的后端作为接受和验证这些令牌的资源服务器。添加更多像 facebook 这样的身份提供者将是一个挑战。

于 2021-07-29T14:03:05.760 回答