在 Google OAuth2 授权流程之后如何将 JWT 从我的后端服务器发送到我的前端
Posted
技术标签:
【中文标题】在 Google OAuth2 授权流程之后如何将 JWT 从我的后端服务器发送到我的前端【英文标题】:How to send a JWT from my back-end server to my front-end after Google OAuth2 Authorization flow 【发布时间】:2021-09-26 12:15:15 【问题描述】:我正在创建一个带有 React 前端和 Java Spring Boot 后端的应用程序。
我的登录流程如下所示:
-
用户在前端点击登录
用户被重定向到我服务器上的 Google Oauth 授权端点
OAuth 2.0 授权流程发生:用户被重定向到 Google 并登录。Google 与我的服务器交互,首先交换授权代码,然后交换 JWT 访问令牌。我的服务器现在拥有用户的 JWT 访问令牌。
问题:我现在需要将 JWT 令牌重定向到我的 React 前端,以便每次用户想要请求访问我服务器上的受保护资源时都可以保存和使用令牌。李>
现在是否有将令牌从服务器重定向到我的 React 前端的行业标准/最佳实践?
Stack Overflow 上有关于这个主题的类似问题,但是它们至少有 3 年的历史,例如How to provide frontend with JSON web token after server authentication? 从那时起,隐式流已被弃用,不再建议将 JWT 存储在本地存储中,https://datatracker.ietf.org/doc/html/rfc6750 明确不鼓励在重定向 URL 中将不记名令牌传递到前端。
我想知道是否有人知道此问题的最新解决方案。
【问题讨论】:
通过授权流程,code
使用重定向到您的回调端点发送回您的前端应用程序。您只需使用令牌端点(POST 请求)使用该代码。 RFC6749, section 4.1 清楚地解释了这个过程。
您好,感谢您的评论,但您的建议似乎是在我的服务器和我的前端之间分裂我的授权代码流。这不是我想做的。我更愿意在我的后端服务器上完成整个授权流程,因为 Spring boot 在验证、缓存令牌和创建授权用户方面完成了所有工作。我的问题是更多,在 Google 和我的服务器之间的授权流程完成并且我已经有一个 JWT 访问令牌之后,我如何才能将该 JWT 令牌从我的服务器传递到我的前端。
行业标准/最佳实践是不要混合客户端身份验证和服务器端身份验证。
@DaImTo,感谢您的回复,我的所有身份验证都在服务器上进行,我只需要某种方式将完全身份验证的用户 JWT 从我的服务器传递到我的 React 前端。整个 OAuth 2.0 授权流程发生在我的后端服务器上。
那么您对 JWT 的所有使用也应该在后端。
【参考方案1】:
针对基于浏览器的应用程序的 OAuth 2.0 有一个 IETF BCP 草案 - 请参阅 here。基本上,它与使用 PKCE(代码交换证明密钥)的授权码的原生移动应用程序非常相似。
FWIW 我同意不应该使用隐式流,但是 IMO 你不应该使用授权代码流没有 PKCE,因为这个流是用于服务器端呈现的网络应用程序。
编辑 - Auth0(市场上最流行的 CIAM 解决方案之一)文档说同样的话 - 请参阅 here。
如果客户端是单页应用 (SPA),则在 使用 javascript 等脚本语言的浏览器,有两种 授予选项:带有代码证明密钥的授权代码流程 Exchange (PKCE) 和带有表单发布的隐式流程。对于大多数情况, 我们建议使用带有 PKCE 的授权代码流...
【讨论】:
您好,感谢您的回复,ietf 看起来很有用,我可能会使用第 6.2 节为我的应用程序实现一些东西。【参考方案2】:不要。
您似乎在这里混合了 2 个问题。
首先,您想在您的 SPA 中使用 OIDC 进行身份验证。为此,您可以使用带有 PKCE 的 OIDC 隐式流或授权代码流。
其次,您希望将身份验证委托给 google,而不是自己进行。基本上这就是所谓的联合——你信任外部身份提供者。
完整的版本将是设置您自己的身份提供者服务器(例如 keycloak)并在那里配置联合到谷歌。您的 SPA 会针对您的身份提供者启动 OIDC,甚至不知道谷歌进行了身份验证。如有必要,您还可以轻松添加更多身份提供者(例如 facebook)。
更简单的解决方法是从您的 SPA 直接启动 OIDC 登录到 Google。这样,您的 SPA 将直接从 google 接收令牌,并且您需要保护自己的后端作为接受和验证这些令牌的资源服务器。添加更多像 facebook 这样的身份提供者将是一个挑战。
【讨论】:
以上是关于在 Google OAuth2 授权流程之后如何将 JWT 从我的后端服务器发送到我的前端的主要内容,如果未能解决你的问题,请参考以下文章
将授权机制 ClientLogin 迁移到 OAuth2 Google AdWords v201206 Perl
Google OAuth2 - 令牌的交换访问代码 - 不起作用
如何使用 OAuth2 授权 Google 分析数据 API