微服务集群中的授权架构
Authorization architecture in microservice cluster
我有一个微服务架构的项目(在 Docker 和 Kubernetes 上),2 个主要应用程序是使用 AIOHTTP 和 Django 在 Python 中编写的(还有 Ingress 代理,静态文件服务器,还有一些是用 NginX 制作的)。我想将这些 Python 应用程序拆分成单独的较小微服务,但要实现这一点,我可能还应该将身份验证移到一个单独的应用程序中。但是我该怎么做呢?
也许我还应该补充一点,我问的不是特定的身份验证方法,如 OAuth、JWT 等,而是关于集群架构内部的依赖关系和责任划分。
在我看来,一个不错的解决方案是 Ingress NginX 代理服务器的一些插件,或者在它之前的微服务,这样我的 Python 身份验证代理就不会关心方法目标,就像一些中间件一样,只需阅读 headers/cookies,检查访问令牌或 sessionId,如果访问有效则设置 userId,并进一步传递请求。
下面介绍了一个简短的简化架构:
这里是我的想象,少提复杂的连接:
但我不确定这是否合理。此外,这种方法会降低 K8s Ingress 的优势,它提供了从 bash 更新路径 table 的惊人接口,但据我所知,不允许 运行它之前的任何请求处理程序,所以我将不得不 运行 自定义 NginX 代理,而没有良好的 K8s 集成。
因此,还有哪些其他可能的架构解决方案?
我只能想象创建一个请求处理程序,它执行所有授权并将请求传递给其他不关心身份验证的微服务(或通过 RPC),但我认为这不是一般完美的解决方案。
对于微服务,JWT 是首选的身份验证和授权方式。
您可以在集群中将 GCP IAM or OKTA. OR you can run Keycloak 等云资源用作微服务。
- 在这些资源之一中创建了用户。
- 一旦用户通过身份验证,就会返回一个 JWT 令牌(以
前端)。
- 令牌包含与身份验证和授权相关的信息
用户。
- 这个令牌再次从前端发送到后端服务
请求。
- 后端服务将检查身份验证和授权以及
做出相应回应。
此外,令牌通常在固定的时间内有效。所以前端应用程序应该定期刷新令牌。
理论
嗯,网上翻了一大堆资料,咨询了一年半。有一个名为 API Gateway 的架构模式,它描述了集群中的入口点,而这正是 Kubernetes Ingress 所做的,以及我在问题中的想象。一般情况下,它是代理服务器,它是集群微服务的唯一入口点,它可以执行缓存,DDoS 保护,它可以支持不同的 API 协议,操作 URI,管理 API节流、货币化和执行我需要的身份验证。因此,在集群内部的微服务通信期间没有身份验证,因为所有必需的参数、标识符将在请求中显示。
实施
在Kubernetes中,NginX Ingress相当流行,它还支持Basic Auth和OAuth2,这不是一个完美的解决方案,但至少是一些东西。 Kubernetes 有替代的 Ingress 解决方案:Kong、Ambassador、Traefik,它们提供了更多的功能(尽管 Kong 也基于 NginX)。
在Java和Spring的世界中,Spring云网关的存在就是为了解决这样的问题,就像K8s Ingress一样, 允许使用 YAML 描述路径表,但它是可扩展的,允许轻松地为任何身份验证方法嵌入您的自定义代码。
此外,大多数云平台都提供自己的 API 网关服务,或多或少的功能,包括 Google Cloud, Red Hat, AWS, Yandex Cloud。但是,它们似乎缺少身份验证方法,就像扩展的机会一样,尽管它们与这个问题没有太大关系。
阅读
您可以在此处找到有关 API 网关模式及其实现的更多信息:
我有一个微服务架构的项目(在 Docker 和 Kubernetes 上),2 个主要应用程序是使用 AIOHTTP 和 Django 在 Python 中编写的(还有 Ingress 代理,静态文件服务器,还有一些是用 NginX 制作的)。我想将这些 Python 应用程序拆分成单独的较小微服务,但要实现这一点,我可能还应该将身份验证移到一个单独的应用程序中。但是我该怎么做呢?
也许我还应该补充一点,我问的不是特定的身份验证方法,如 OAuth、JWT 等,而是关于集群架构内部的依赖关系和责任划分。
在我看来,一个不错的解决方案是 Ingress NginX 代理服务器的一些插件,或者在它之前的微服务,这样我的 Python 身份验证代理就不会关心方法目标,就像一些中间件一样,只需阅读 headers/cookies,检查访问令牌或 sessionId,如果访问有效则设置 userId,并进一步传递请求。
下面介绍了一个简短的简化架构:
这里是我的想象,少提复杂的连接:
但我不确定这是否合理。此外,这种方法会降低 K8s Ingress 的优势,它提供了从 bash 更新路径 table 的惊人接口,但据我所知,不允许 运行它之前的任何请求处理程序,所以我将不得不 运行 自定义 NginX 代理,而没有良好的 K8s 集成。
因此,还有哪些其他可能的架构解决方案?
我只能想象创建一个请求处理程序,它执行所有授权并将请求传递给其他不关心身份验证的微服务(或通过 RPC),但我认为这不是一般完美的解决方案。
对于微服务,JWT 是首选的身份验证和授权方式。 您可以在集群中将 GCP IAM or OKTA. OR you can run Keycloak 等云资源用作微服务。
- 在这些资源之一中创建了用户。
- 一旦用户通过身份验证,就会返回一个 JWT 令牌(以 前端)。
- 令牌包含与身份验证和授权相关的信息 用户。
- 这个令牌再次从前端发送到后端服务 请求。
- 后端服务将检查身份验证和授权以及 做出相应回应。
此外,令牌通常在固定的时间内有效。所以前端应用程序应该定期刷新令牌。
理论
嗯,网上翻了一大堆资料,咨询了一年半。有一个名为 API Gateway 的架构模式,它描述了集群中的入口点,而这正是 Kubernetes Ingress 所做的,以及我在问题中的想象。一般情况下,它是代理服务器,它是集群微服务的唯一入口点,它可以执行缓存,DDoS 保护,它可以支持不同的 API 协议,操作 URI,管理 API节流、货币化和执行我需要的身份验证。因此,在集群内部的微服务通信期间没有身份验证,因为所有必需的参数、标识符将在请求中显示。
实施
在Kubernetes中,NginX Ingress相当流行,它还支持Basic Auth和OAuth2,这不是一个完美的解决方案,但至少是一些东西。 Kubernetes 有替代的 Ingress 解决方案:Kong、Ambassador、Traefik,它们提供了更多的功能(尽管 Kong 也基于 NginX)。
在Java和Spring的世界中,Spring云网关的存在就是为了解决这样的问题,就像K8s Ingress一样, 允许使用 YAML 描述路径表,但它是可扩展的,允许轻松地为任何身份验证方法嵌入您的自定义代码。
此外,大多数云平台都提供自己的 API 网关服务,或多或少的功能,包括 Google Cloud, Red Hat, AWS, Yandex Cloud。但是,它们似乎缺少身份验证方法,就像扩展的机会一样,尽管它们与这个问题没有太大关系。
阅读
您可以在此处找到有关 API 网关模式及其实现的更多信息: