首页 > 解决方案 > Ingress 如何支持 JWT 身份验证?

问题描述

现在我使用 Ingress-Nginx 作为外部流量的路由服务。但是,很少有文章介绍 Ingress 如何使用 JWT 身份验证来保护内部 API。有人可以分享一些关于它的信息吗?

标签: kubernetesjwtkubernetes-ingressnginx-ingress

解决方案


根据研究:

不同的身份验证 API 调用以 OAuth 2.0 访问令牌的形式合并。

这些是从客户端传递到 API 服务器的身份验证凭据,通常作为 HTTP 标头携带。

RFC 7519定义的 JSON Web Token (JWT)就是其中之一。

根据文档:

JSON Web Token (JWT) 是一种紧凑的、URL 安全的方式,用于表示要在两方之间传输的声明。JWT 中的声明被编码为 JSON 对象,用作 JSON Web 签名 (JWS) 结构的有效负载或 JSON Web 加密 (JWE) 结构的明文,使声明能够进行数字签名或完整性保护带有消息验证码 (MAC) 和/或加密。

可以使用不同的入口控制器(如kubernetes nginx-ingressnginxinc ingress controller )应用此机制。

根据 nginx inc 文档:

NGINX auth_request 模块用于代表后端服务验证令牌。

请求仅在客户端提供有效令牌时才到达后端服务 现有后端服务可以使用访问令牌进行保护,无需更改代码 仅 NGINX 实例(不是每个应用程序)需要向 IdP 注册 行为对于每个错误情况都是一致的,包括丢失或无效的令牌

因此,对于 NGINX 作为一个或多个应用程序的反向代理,我们可以使用 auth_request 模块在代理请求到后端之前触发对 IdP 的 API 调用。

要使用提供身份验证的现有服务,可以使用nginx.ingress.kubernetes.io/auth-url注释 Ingress 规则,以指示应发送 HTTP 请求的 URL。

在这里您可以找到工作示例 nginx-subrequest-auth-jwt

该项目实现了一个简单的 JWT 验证端点,旨在与 NGINX 的子请求身份验证一起使用,并且特别适用于 Kubernetes NGINX Ingress Controller 外部身份验证注释

它根据配置的公钥验证在 Authorization 标头中传递的 JWT 令牌,并进一步验证 JWT 是否包含适当的声明。

此示例使用PyJwt python 库,它允许您对 JSON Web 令牌 (JWT) 进行编码和解码

附加资源:

希望这有帮助。


推荐阅读