ngx_http_auth_jwt_module 模块

ngx_http_auth_jwt_module 模块 (1.11.3) 通过使用指定的密钥验证提供的 JSON Web Token (JWT) 来实现客户端授权。该模块支持 JSON Web 签名 (JWS)、JSON Web 加密 (JWE) (1.19.7) 和嵌套 JWT (1.21.0)。该模块可用于 OpenID Connect 身份验证。

该模块可以通过 satisfy 指令与其他访问模块组合,例如 ngx_http_access_module、ngx_http_auth_basic_module 和 ngx_http_auth_request_module。

注意:该模块作为我们商业订阅的一部分提供。

支持的算法

该模块支持以下 JSON Web 算法。JWS算法:

  • HS256, HS384, HS512

  • RS256, RS384, RS512

  • ES256, ES384, ES512

  • EdDSA (Ed25519 和 Ed448 签名) (1.15.7)

注意:在 1.13.7 版本之前,仅支持 HS256、RS256、ES256 算法。

JWE 内容加密算法 (1.19.7):

  • A128CBC-HS256, A192CBC-HS384, A256CBC-HS512

  • A128GCM, A192GCM, A256GCM

JWE 密钥管理算法 (1.19.9):

  • A128KW, A192KW, A256KW

  • A128GCMKW, A192GCMKW, A256GCMKW

  • dir - 直接使用共享对称密钥作为内容加密密钥

  • RSA-OAEP, RSA-OAEP-256, RSA-OAEP-384, RSA-OAEP-512 (1.21.0)

示例配置

location / {
    auth_jwt          "closed site";
    auth_jwt_key_file conf/keys.json;
}

指令

auth_jwt 指令

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

启用 JSON Web 令牌验证,指定的 string 用作 realm,参数值可以包含变量。

可选的 token 参数指定一个包含 JSON Web Token 的变量。

默认情况下,JWT 在 “Authorization” 请求头传递 “Bearer Token”。JWT 也可以作为 cookie 或查询字符串的一部分传递:

auth_jwt "closed site" token=$cookie_auth_token;

指令设置为 off,则取消从先前配置级别继承的 auth_jwt 指令配置。

auth_jwt_claim_set 指令

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

该指令出现在 1.11.10 版中。

将变量设置为由键名称标识的 JWT 声明参数,名称匹配从 JSON 树的顶层开始。对于数组,该变量保留用逗号分隔的数组元素列表。

auth_jwt_claim_set $email info e-mail;
auth_jwt_claim_set $job info "job title";

在 1.13.7 版本之前,只能指定一个键名,结果是未定义的数组。

使用JWE加密的令牌的变量值只有在解密之后才可用,解密发生在访问阶段。

auth_jwt_header_set 指令

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

该指令出现在 1.11.10 版中。

将变量设置为由键名标识的 JOSE 头参数,名称匹配从 JSON 树的顶层开始。对于数组,该变量保存以逗号分隔的数组元素列表。

在 1.13.7 版本之前,只能指定一个键名,结果是未定义的数组。

auth_jwt_key_file 指令

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

指定用于验证 JWT 签名的 JSON Web 密钥集格式的文件,参数值可以包含变量。

可以在同一级别 (1.21.1) 上指定多个 auth_jwt_key_file 指令:

auth_jwt_key_file conf/keys.json;
auth_jwt_key_file conf/key.jwk;

如果至少有一个指定的键无法加载或处理,nginx 将返回 500(内部服务器错误)错误。

auth_jwt_key_request 指令

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

该指令出现在 1.15.6 版中。

允许从子请求中检索 JSON Web 密钥集文件以验证 JWT 签名并设置子请求将发送到的 URI,参数值可以包含变量。为避免验证开销,建议缓存密钥文件:

proxy_cache_path /data/nginx/cache levels=1 keys_zone=foo:10m;

server {
    ...

    location / {
        auth_jwt             "closed site";
        auth_jwt_key_request /jwks_uri;
    }

    location = /jwks_uri {
        internal;
        proxy_cache foo;
        proxy_pass  http://idp.example.com/keys;
    }
}

可以在同一级别 (1.21.1) 上指定多个 auth_jwt_key_request 指令:

auth_jwt_key_request /jwks_uri;
auth_jwt_key_request /jwks2_uri;

如果至少有一个指定的键无法加载或处理,nginx 将返回 500(内部服务器错误)错误。

auth_jwt_leeway 指令

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

该指令出现在 1.13.10 版中。

设置在验证 exp 和 nbf JWT 声明时补偿时钟偏差的最大允许余量。

auth_jwt_type 指令

语 法:auth_jwt_type signed | encrypted | nested;
默认值:auth_jwt_type signed;
上下文:http, server, location, limit_except

该指令出现在 1.19.7 版中。

指定需要哪种类型的 JSON Web 令牌:JWS(签名)、JWE(加密)或签名然后加密的嵌套 JWT(嵌套)(1.21.0)。

auth_jwt_require 指令

语 法:auth_jwt_require value ...;
默认值:—
上下文:http, server, location, limit_except

该指令出现在 1.21.2 版中。

定义 JWT 验证的附加条件。该值可以包含文本、变量及其组合。只有当所有值都不为空且不等于 “0” 时,认证才会成功。

map $jwt_claim_iss $valid_jwt_iss {
    "good" 1;
}
...

auth_jwt_require $valid_jwt_iss;

嵌入变量

ngx_http_auth_jwt_module 模块支持嵌入变量:

$jwt_header_name

返回指定 JOSE 头的值

$jwt_claim_name

返回指定 JWT 声明的值

对于嵌套声明和包含点(“.”)的声明,无法评估变量的值; 应该使用 auth_jwt_claim_set 指令代替。

使用JWE加密的令牌的变量值只有在解密之后才可用,解密发生在访问阶段。

$jwt_payload

返回经过解密的嵌套或加密令牌的顶级有效负载(1.21.2)。对于嵌套的令牌,返回包含的JWS令牌。对于加密的令牌,返回带有声明的JSON。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号