NGINX 的 ngx_http_auth_jwt_module模块

一、模块概述

ngx_http_auth_jwt_module 模块用于通过验证请求中提供的 JWT 来进行客户端授权。此模块支持 JSON Web 签名(JWS)、JSON Web 加密(JWE)以及嵌套 JWT(Nested JWT),使其成为一种灵活且安全的认证方案。它通常与其他访问控制模块(如 ngx_http_access_modulengx_http_auth_basic_module 等)配合使用,提供多层次的访问控制。

二、支持的算法

该模块支持以下 JSON Web 算法(JWS 和 JWE):

  • JWS 签名算法

    • HS256、HS384、HS512(HMAC SHA 算法)
    • RS256、RS384、RS512(RSA 签名算法)
    • ES256、ES384、ES512(ECDSA 签名算法)
    • EdDSA(Ed25519 和 Ed448 签名算法)
  • JWE 内容加密算法

    • A128CBC-HS256、A192CBC-HS384、A256CBC-HS512
    • A128GCM、A192GCM、A256GCM
  • JWE 密钥管理算法

    • RSA-OAEP、RSA-OAEP-256、RSA-OAEP-384、RSA-OAEP-512

三、配置示例

以下是一个基本的配置示例:

nginx 复制代码
location / {
    auth_jwt "closed site";
    auth_jwt_key_file conf/keys.json;
}

在这个配置中,auth_jwt 启用了 JWT 验证,并指定了 JWT 密钥文件 keys.json 用于验证 JWT 签名。

四、主要指令

4.1. auth_jwt

语法auth_jwt string [token=$variable] | off;
默认值auth_jwt off;
上下文http, server, location, limit_except

此指令用于启用 JWT 验证,string 参数指定了一个 Realm,作为认证域。你可以在这个值中使用变量。默认情况下,JWT 会在 Authorization 头部作为 Bearer Token 提供。如果你希望 JWT 通过其他方式传递(例如通过 cookie 或查询字符串),可以使用 token 参数。

nginx 复制代码
auth_jwt "closed site" token=$cookie_auth_token;
4.2. auth_jwt_key_file

语法auth_jwt_key_file file;
默认值 :无
上下文http, server, location, limit_except

此指令指定一个 JSON Web 密钥文件,用于验证 JWT 的签名。这个文件必须遵循 JSON Web Key Set (JWKS) 格式。多个 auth_jwt_key_file 指令可以同时使用,用来指定多个密钥文件。

nginx 复制代码
auth_jwt_key_file /etc/nginx/keys.json;
4.3. auth_jwt_claim_set

语法auth_jwt_claim_set $variable name ...;
默认值 :无
上下文http

该指令用于将 JWT 声明参数设置为指定的变量。声明参数可以是 JWT 中任何层级的键值对,支持数组,数组中的元素将以逗号分隔。

nginx 复制代码
auth_jwt_claim_set $email info email;
auth_jwt_claim_set $role info role;
4.4. auth_jwt_header_set

语法auth_jwt_header_set $variable name ...;
默认值 :无
上下文http

此指令用于将指定的 JWT 头部参数设置为变量。

4.5. auth_jwt_key_request

语法auth_jwt_key_request uri;
默认值 :无
上下文http, server, location, limit_except

此指令允许通过子请求从指定 URI 获取 JSON Web 密钥集文件,用于验证 JWT 的签名。这种方式可以在需要时动态获取密钥,减少密钥管理的复杂性。

nginx 复制代码
auth_jwt_key_request /jwks_uri;
4.6. auth_jwt_leeway

语法auth_jwt_leeway time;
默认值auth_jwt_leeway 0s;
上下文http, server, location

此指令设置在验证 JWT 的 exp(过期时间)和 nbf(生效时间)声明时,允许的最大时间偏差。它有助于缓解因服务器时钟不一致导致的时间问题。

五、嵌入变量

ngx_http_auth_jwt_module 支持以下嵌入变量,方便在配置中使用:

  • $jwt_header_name:返回指定 JWT 头部的值。
  • $jwt_claim_name:返回指定 JWT 声明的值。
  • $jwt_payload:返回解密后的 JWT 内容。

六、结合其他模块使用

ngx_http_auth_jwt_module 模块可以与其他访问控制模块(如 ngx_http_access_modulengx_http_auth_basic_module)结合使用。通过 satisfy 指令,可以实现灵活的访问控制。例如,既可以基于 JWT 进行身份验证,也可以基于 IP 地址进行限制:

nginx 复制代码
location / {
    satisfy any;
    auth_jwt "closed site";
    auth_basic "restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd;
    allow 192.168.1.0/24;
    deny all;
}

在这个示例中,访问控制同时依赖于 JWT 和 HTTP 基本认证,且仅允许从 192.168.1.0/24 网络段的请求。

七、总结

ngx_http_auth_jwt_module 模块为 NGINX 提供了强大的基于 JWT 的身份验证能力,支持多种算法,并且能灵活地与其他模块结合使用,实现复杂的访问控制策略。无论是在 OpenID Connect 认证还是微服务架构中,JWT 都能为你提供安全、轻量级的认证方式。

希望通过本文,大家能够更好地理解 ngx_http_auth_jwt_module 模块的配置和使用方式,为实现安全可靠的身份认证打下基础。

相关推荐
tt666qq24 分钟前
linux文件系统学习
linux·运维·学习
杨云龙UP40 分钟前
SQL Server数据库事务日志问题的诊断与解法(从膨胀到瘦身)
运维·数据库·sql·sqlserver·serverless
七七七七071 小时前
【Linux系统】进程替换
linux·运维·服务器
爱吃KFC的大肥羊1 小时前
应用层协议——HTTP
网络·网络协议·http
boy快快长大2 小时前
【面试题】HTTP与HTTPS的区别
网络协议·http·https
霍格沃兹软件测试开发2 小时前
Playwright MCP浏览器自动化详解指南
运维·自动化
前行居士2 小时前
Sub-process /usr/bin/dpkg returned an error code (1)
linux·运维·windows
蒋星熠2 小时前
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
运维·人工智能·爬虫·python·深度学习·机器学习·自动化
迎風吹頭髮3 小时前
UNIX下C语言编程与实践19-UNIX 三级索引结构:直接索引、一级/二级/三级间接索引的文件存储计算
运维·云计算·unix
数智顾问3 小时前
AI自动化测试:接口测试全流程自动化的实现方法——从需求到落地的全链路实践
运维·人工智能·自动化