无需托管 API 网关的多个服务的 FastAPI 身份验证

Posted

技术标签:

【中文标题】无需托管 API 网关的多个服务的 FastAPI 身份验证【英文标题】:FastAPI authentication for multiple services without managed API Gateway 【发布时间】:2021-04-22 04:46:10 【问题描述】:

我有一个关于基于 FastAPI 的微服务新项目的一般架构问题。现在看它确实不是 FastAPI 特定的,但它是这样的:

假设以下情况,您将如何使基于 JWT 的身份验证在多个服务之间工作:

    您不能使用来自 AWS 等的托管服务,例如 API Gateway(安全要求) 有一个用户管理服务,其中包含用户名、密码等,理想情况下它允许 JWT 身份验证 还有其他微服务包含存储在第一个微服务中的用户的应用程序逻辑(来自 2.)

在单体应用中这很容易,在带有 API 网关的微服务架构中也很容易,但是:

如果事情取决于用户管理微服务来保存相关的用户数据(实际上是它自己的网关),那么您将如何处理这个(高级),而其他服务应该为这些用户执行操作(基于在 JWT 令牌上)

tl;dr 您如何将身份验证扩展到其他持有应用程序逻辑的微服务?我想我想太多了,可能会引入太多的耦合:)

【问题讨论】:

从身份验证的角度来看,使用您自己的用户管理服务和您所称的公共 API 网关有什么区别?我想说的诀窍在于开发用户管理服务以拥有您需要的功能,然后其余的流程保持不变。 这是一个安全要求——这个项目只需要一个基于用户的身份验证,仅仅拥有一个 API 网关是不够的。微服务是移动应用程序的后端,它应该首先对用户进行身份验证,然后只显示允许其用户使用/查看的信息。在单体应用中,您可以只保护您的端点并在所有端点上使用 JWT 身份验证,但需要使用用户 mgmt。现在在一个单独的服务中,它变得有点棘手 我明白,我的意思是,一旦您创建了具有您需要的所有安全功能的用户管理服务,您就可以像使用标准 API 网关一样使用它。但是,我可能不完全理解您的用例。请参阅下面的答案以获取潜在的解决方案。 是的,我目前正在查看 Traefik w。 ForwardAuth + 我的用户管理。服务作为解决方案。遗憾的是,JWT 仅在 Traefik Enterprise 中,但由于我正在构建自己的服务 ForwardAuth 可能没问题。你有其他开源替代品吗?我认为我们的想法是一致的 :) 【参考方案1】:

如果您的身份验证/用户管理服务发出 JWT,那么您的其他服务可以依赖它来仅提供允许的数据。

发行的令牌应包含所有相关的安全信息。假设您有三种类型的用户:管理员、经理、员工。为简单起见,假设这是唯一的安全标准(您可能有多个标准)。

令牌可以有一个指示用户权限的字段。根据OAuth2 规范,这通常在scope 字段中完成。无论如何,您都可以为其创建自己的自定义字段。

使用该令牌,您可以使用它调用您的后端服务。然后服务将:

首先检查令牌的完整性和有效性 检查令牌有效负载的范围/权限并根据它提供数据。

另请参阅官方FastAPI tutorial,了解如何通过简单的依赖注入将作用域用于此目的。


回答您的评论:

遗憾的是,JWT 只在 Traefik Enterprise 中

也许您是在谈论直接在 Traefik 中处理 JWT,但您应该可以毫无问题地传递授权标头并处理后端服务中的授权检查。此外,您始终可以将令牌嵌入到请求正文中并完全绕过反向代理。

【讨论】:

谢谢你!我认为这个谜题几乎完成了。 1)您是否看到有关范围的任何(不良)耦合问题?我的意思是,如果定义的范围在定义用户可以在每个服务中看到的内容时过于详细/耦合,这只是一个问题。 2) 完整性/有效性检查是否意味着所有服务都可以正确使用 JWT 密码? 1) 肯定会涉及到一定数量的耦合,但我怀疑你可以避免它。如果您考虑常见的身份验证服务(google、fb 等),它们也使用范围,您必须遵守它们,因此根据定义,您的应用程序必须与它们的范围结构相结合。这就像一个 API 规范。任何两个通信服务都必须使用一些共同点。 2) 是的。如果您将身份验证检查传递给服务,所有服务都必须验证令牌和权限,但使用 FastAPI 非常简单,只需按照教程进行即可。 谢谢!标记为已回答

以上是关于无需托管 API 网关的多个服务的 FastAPI 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

牛棚资讯|全程托管化繁为简,京东云上线API网关服务

静态网站利用云函数 SCF + API 网关访问自定义后端接口

阿里云API网关

FastAPI框架快速构建高性能的api服务

我们如何向一个本地数据网关添加多个订阅?

如何构建一个可用的企业级API网关?