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 模块的配置和使用方式,为实现安全可靠的身份认证打下基础。

相关推荐
杨浦老苏1 天前
家庭实验室监控仪表盘HomeLab-Monitor
运维·docker·监控·群晖
回忆2012初秋1 天前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
Urbano1 天前
工装外套全制作流程、工序痛点及自动化设备升级方案
运维·自动化
映翰通朱工1 天前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
洪晓露1 天前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
谢平康1 天前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
IP老炮不瞎唠1 天前
Python 价格监控如何实现?思路与实用方法分享
运维·服务器·网络
GIS数据转换器1 天前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
Tokai_Teio_11 天前
第四届黄河流域 misc
运维·服务器
hj2862511 天前
Linux 网络服务综合笔记(概念 + 命令 + 实操案例)2
linux·运维·网络