如何解决如果 Metaserver 令牌覆盖 Auth0 令牌,如何使用 JWT Auth0 令牌进行 Cloud Run 服务到服务的通信 先决条件问题问题
先决条件
我有两个 Cloud Run 服务,一个 frontend
和一个 backend
。前端是用 Vue.js/Nuxt.js 编写的,因此使用的是 Node 后端。后端使用 Kotlin 和 Spring Boot 编写。
问题
要在前端和后端之间进行经过身份验证的内部通信,我需要使用令牌 thttps://cloud.google.com/run/docs/authenticating/service-to-service#javahat 从 google 元服务器获取.这在此处记录:https://cloud.google.com/run/docs/authenticating/service-to-service#java
我确实设置了一切并且可以正常工作。
对于我的第二层安全性,我在前端和后端都集成了 Auth0 身份验证提供程序。在我的前端,用户可以登录。前端正在调用后端 API。由于只有授权用户才能调用后端,因此我集成了 Spring Security 以保护后端 API 端点。
现在后端验证调用者请求的令牌是否有效,然后再允许它传递给 API 逻辑。
然而这个理论行不通。这仅仅是因为我通过 Node 后端代理委托 API 调用。然而,代理逻辑已经将令牌应用于后端的请求;它是谷歌元服务器令牌。那么让我来说明一下:
Client (Browser) -> API Request with Auth0 Token -> Frontend Backend Proxy -> Overriding Auth0 Token with Google Metaserver Token -> Calling Backend API
由于后端接收的是元服务器令牌而不是 Auth0 令牌,因此它永远无法成功授权 API 调用。
问题
由于我找不到关于这个问题的任何文章,我想知道这是否仅仅是因为我做的基本上是错误的。
我需要做什么才能拥有有效的 Cloud Run 服务到服务通信(由元服务器令牌保证),但同时拥有具有 Auth0 授权的安全后端 API?
我看到了两种解决方法来实现这一点:
- 在 Node 后端代理逻辑中授权 API 调用
- 公开后端服务,因此不需要元服务器令牌
我不喜欢以上任何一种——尤其是后一种。我真的很想让它与我当前的设置一起工作,但我不知道如何。没有多重授权令牌这样的东西吧?
解决方法
好的,我想出了第三种方法来实现事实上的内部服务来服务通信。
为了省略元服务器令牌身份验证但仍限制从 Internet 的访问,我为我的 backend
云运行服务执行了以下操作:
这使得该服务可从 Internet 获得但是入口阻止任何外部人员访问该服务。该服务无需 IAM 即可使用,但仅适用于内部流量。
所以我的 frontend
现在通过 Node 后端代理调用 backend
API。尽管 frontend
节点后端和 backend
服务都有些“在云端”,但它们并不共享相同的“内部网络”。事实上,frontend
节点后端请求将通过出口重定向到互联网,并像任何其他互联网用户一样调用 backend
服务。
为了让它“像来自内部一样”工作,你必须做一些类似 VPN 的事情,但它被称为 VPC(虚拟私有云)。幸运的是,这非常简单。只需在 GCP 中创建一个 VPC 连接器即可。
但注意创建所谓的无服务器 VPC 访问(连接器)。此处解释:https://cloud.google.com/vpc/docs/serverless-vpc-access
创建无服务器 VPC 访问后,您可以在 Cloud Run 服务“连接”设置中选择它。对于 backend
服务,可以简单地选择它。但是对于 frontend
服务,选择第二个选项很重要:
至少对我来说这很重要,因为我通过分配的服务 URL 而不是私有 IP 调用 backend
服务。
在这一切完成后,我从 frontend
获得的 JWT 令牌成功传送到 backend
API,而没有被 MetaServer 令牌覆盖。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。