我有一个关于基于FastAPI的微服务新项目的一般架构问题。现在看看它,它真的不是特定于FastAPI的,但它是这样的:
如何使基于JWT的身份验证在多个服务之间工作?
- 您不能使用来自AWS等的托管服务,如API网关(安全要求)
- 有一个用户管理服务,它包含用户名,密码等,理想情况下它将允许JWT身份验证
- 有其他的微服务包含应用逻辑的用户存储在第一个微服务(从2.)
在单体应用中这很容易,在带有API网关的微服务架构中也很容易,但是:
如果事情取决于用户管理微服务来保存相关的用户数据(实际上是它自己的网关),而其他服务应该为这些用户执行操作(基于JWT令牌),那么你将如何处理这个(高层)
tl;dr如何将身份验证扩展到持有应用程序逻辑的其他微服务?我想我想得太多了,可能引入了太多的耦合:)
如果您的身份验证/用户管理服务发出JWT,那么您的其他服务可以依赖它只提供允许的数据。
发出的令牌应该包含所有相关的安全信息。假设您有三种类型的用户:admin、manager、employee。为简单起见,假设这是唯一的安全标准(您可能有多个标准)。
令牌可以有一个表示用户权限的字段。根据OAuth2规范,这通常在scope
字段中完成。你可以为它创建自己的自定义字段。
- 首先检查令牌的完整性和有效性
- 检查令牌有效载荷的范围/权限,并根据它提供数据
参见FastAPI官方教程,通过简单的依赖注入来使用作用域。
回复您的评论:
JWT只属于Traefik Enterprise
也许您正在谈论在Traefik中直接处理JWT,但是您应该可以轻松地传递授权报头并在后端服务中处理授权检查。另外,你可以在请求正文中嵌入令牌,完全绕过反向代理。