kubernetes - Ingress 如何支持 JWT 身份验证?
问题描述
现在我使用 Ingress-Nginx 作为外部流量的路由服务。但是,很少有文章介绍 Ingress 如何使用 JWT 身份验证来保护内部 API。有人可以分享一些关于它的信息吗?
解决方案
根据研究:
不同的身份验证 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-ingress或nginxinc ingress controller )应用此机制。
根据 nginx inc 文档:
NGINX auth_request 模块用于代表后端服务验证令牌。
请求仅在客户端提供有效令牌时才到达后端服务 现有后端服务可以使用访问令牌进行保护,无需更改代码 仅 NGINX 实例(不是每个应用程序)需要向 IdP 注册 行为对于每个错误情况都是一致的,包括丢失或无效的令牌
因此,对于 NGINX 作为一个或多个应用程序的反向代理,我们可以使用 auth_request 模块在代理请求到后端之前触发对 IdP 的 API 调用。
- 在 kubernetes 入口中,您可以找到有关外部身份验证的信息
要使用提供身份验证的现有服务,可以使用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) 进行编码和解码
附加资源:
希望这有帮助。
推荐阅读
- android - 如何调用主要活动中的片段以通过图像播放视频
- javascript - 避免在输入元素中输入,在 JavaScript 中除了英文字母之外的任何内容
- c# - 如何使用 C# 在 asp.net 中加密和验证密码?
- javascript - 在 HTML 端从 Javascript 呈现项目时传递正确的信息
- swift - Swift:按属性对列表对象进行排序
- javascript - 为什么这个组件根本不显示?反应日期选择器
- parsing - Logstash IIS 日志解析:Cookie 字段被截断
- docker - 如何使用 ps 在 BusyBox 中 grep 进程
- javascript - 通过 Math.js 返回美元值总计时添加“.00”
- elasticsearch - 在 Elasticsearch 嵌套 aggs 脚本中访问父字段的正确方法