AWS Cognito 基于 JWT 属性的路由

Posted

技术标签:

【中文标题】AWS Cognito 基于 JWT 属性的路由【英文标题】:AWS Cognito JWT attribute-based routing 【发布时间】:2022-01-08 00:32:26 【问题描述】:

我是 AWS 及其服务的新手。我想要实现的是多租户 SaaS 应用程序。我的概念是这样的: 我使用 Cognito 进行用户身份验证。所有用户,无论他们属于哪个租户,都应该使用一个前端登录。对于租户识别,我使用登录成功时从 JWT 获得的自定义属性“custom:tenant”。 对于申请本身,我想使用 VPC 并确保封装每个租户都应该拥有自己的 VPC。

例子:

租户 1 的用户 A 登录并返回带有声明“custom:tenant”:“1”的 JWT 应路由到 VPC 1 租户 2 的用户 B 登录并返回带有声明“custom:tenant”:“2”的 JWT 应路由到 VPC 2

现在我的问题是:如何实现从登录成功到相应 VPC 的路由?我是否需要进一步的服务或在哪里可以找到这些设置?

【问题讨论】:

澄清一下 - 您在不同的 VPC 中创建了 EC2 实例(或自动扩展组),您只需将请求从 FE 路由到适当的后端(在适当的 VPC 中)? 是的,只是根据 jwt 声明路由到适当的 vpc 【参考方案1】:

有一种标准的基于内容的路由技术,用于基于 JWT 的内容进行路由。这种类型的东西通常由放置在 API 前面的反向代理或 API 网关管理,它们运行一些自定义逻辑来读取 JWT 并相应地路由。这也将管道保持在应用程序组件之外。

示例

这是一个用 LUA(一种高级脚本语言)编码的 nginx 示例,用于读取 JWT 并提取声明。在此示例中,它是一个区域,而在您的情况下,它是一个租户 ID:

NGINX Configuration NGINX Plugin Code Architecture Article

先决条件

虽然不是所有的中间件都支持这种类型的路由。例如,您将无法在简单的负载均衡器中执行此操作。一种选择可能是使用NGINX as a cloud managed service,尽管它会花钱。不过,在 API 之前的良好网关是一个重要的架构组件,因此请看看您的公司是否认为值得投资。

【讨论】:

以上是关于AWS Cognito 基于 JWT 属性的路由的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito JWT 令牌验证

AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌

Nest.js 与 AWS Cognito,如何访问用户属性

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

为啥 AWS Cognito 对 JWT 使用多个公有密钥?

AWS Cognito 中的“访问令牌不包含 openid 范围”