当前位置: 首页 > backend >正文

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

三、配置示例

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

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 参数。

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 指令可以同时使用,用来指定多个密钥文件。

auth_jwt_key_file /etc/nginx/keys.json;
4.3. auth_jwt_claim_set

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

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

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 的签名。这种方式可以在需要时动态获取密钥,减少密钥管理的复杂性。

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 地址进行限制:

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

http://www.xdnf.cn/news/4022.html

相关文章:

  • 模块方法模式(Module Method Pattern)
  • JavaScript 实现输入框的撤销功能
  • 算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)
  • Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)
  • C++ 类与对象(下)—— 进阶特性与底层机制解析(构造函数初始化,类型转换,static成员,友元,内部类,匿名对象)
  • 基于 HTML 和 CSS 实现的 3D 翻转卡片效果
  • WebRTC 服务器之SRS服务器概述和环境搭建
  • 【算法笔记】动态规划基础(二):背包dp
  • TopK题-快速选择方法
  • 数据结构实验8.1:图的基本操作
  • 联邦学习的深度解析,有望打破数据孤岛
  • 005-nlohmann/json 基础方法-C++开源库108杰
  • Sim Studio 是一个开源的代理工作流程构建器。Sim Studio 的界面是一种轻量级、直观的方式,可快速构建和部署LLMs与您最喜欢的工具连接
  • 网络安全自动化:找准边界才能筑牢安全防线
  • 数据结构中 数组、链表、图的概念
  • 深入理解CSS盒子模型
  • 如何使用QWidgets设计一个类似于Web Toast的控件?
  • 【Java ee初阶】多线程(5)
  • Electron 架构详解:主进程与渲染进程的协作机制
  • [低代码 + AI] 明道云与 Dify 的三种融合实践方式详解
  • FreeRTOS菜鸟入门(十一)·信号量·二值、计数、递归以及互斥信号量的区别·优先级翻转以及继承机制详解
  • 英伟达语音识别模型论文速读:Token-and-Duration Transducer(TDT)架构
  • Android 控件CalendarView、TextClock用法
  • Notebook.ai 开源程序是一套工具,供作家、游戏设计师和角色扮演者创建宏伟的宇宙 - 以及其中的一切
  • GZ人博会自然资源系统(测绘)备考笔记
  • 25:三大分类器原理
  • 小刚说C语言刷题—1038编程求解数学中的分段函数
  • brpc 安装及使用
  • MVC、MVP、MVVM三大架构区别
  • HTML05:超链接标签及应用