模块 ngx_http_auth_jwt_module

支持的算法
示例配置
指令
     auth_jwt
     auth_jwt_claim_set
     auth_jwt_header_set
     auth_jwt_key_cache
     auth_jwt_key_file
     auth_jwt_key_request
     auth_jwt_leeway
     auth_jwt_type
     auth_jwt_require
嵌入变量

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

该模块可以与其他访问模块结合使用,例如 ngx_http_access_modulengx_http_auth_basic_modulengx_http_auth_request_module,通过 satisfy 指令。

此模块作为我们 商业订阅 的一部分提供。

支持的算法

该模块支持以下 JSON Web 算法

JWS 算法

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

JWE 内容加密算法 (1.19.7)

JWE 密钥管理算法 (1.19.9)

示例配置

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

指令

语法 auth_jwt 字符串 [token=$变量] | off;
默认值
auth_jwt off;
上下文 httpserverlocationlimit_except

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

可选的 token 参数指定包含 JSON Web 令牌的变量。默认情况下,JWT 通过“Authorization”标头作为 Bearer 令牌 传递。JWT 也可以作为 cookie 或查询字符串的一部分传递。

auth_jwt "closed site" token=$cookie_auth_token;

特殊值 off 取消从先前配置级别继承的 auth_jwt 指令的效果。

语法 auth_jwt_claim_set $变量 名称 ...;
默认值
上下文 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 $变量 名称 ...;
默认值
上下文 http

此指令出现在 1.11.10 版本中。

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

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

语法 auth_jwt_key_cache 时间;
默认值
auth_jwt_key_cache 0;
上下文 httpserverlocation

此指令出现在 1.21.4 版本中。

启用或禁用从 文件子请求 获取的密钥的缓存,并为其设置缓存时间。不支持从变量获取的密钥的缓存。默认情况下,密钥缓存被禁用。

语法 auth_jwt_key_file 文件;
默认值
上下文 httpserverlocationlimit_except

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

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

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

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

语法 auth_jwt_key_request uri;
默认值
上下文 httpserverlocationlimit_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;
    }
}

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

auth_jwt_key_request /jwks_uri;
auth_jwt_key_request /jwks2_uri;

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

语法 auth_jwt_leeway 时间;
默认值
auth_jwt_leeway 0s;
上下文 httpserverlocation

此指令出现在 1.13.10 版本中。

设置最大允许的余量,以补偿在验证 expnbf JWT 声明时出现的时钟偏差。

语法 auth_jwt_type signed | encrypted | nested;
默认值
auth_jwt_type signed;
上下文 httpserverlocationlimit_except

此指令出现在 1.19.7 版本中。

指定要期望的 JSON Web 令牌类型:JWS (signed)、JWE (encrypted) 或已签名然后加密的嵌套 JWT (nested) (1.21.0)。

语法 auth_jwt_require $值 ... [error=401 | 403] ;
默认值
上下文 httpserverlocationlimit_except

此指令出现在 1.21.2 版本中。

指定 JWT 验证的其他检查。该值可以包含文本、变量及其组合,并且必须以变量开头 (1.21.7)。只有当所有值都不为空且不等于“0”时,身份验证才会成功。

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

auth_jwt_require $valid_jwt_iss;

如果任何检查失败,则返回 401 错误代码。可选的 error 参数 (1.21.7) 允许将错误代码重新定义为 403

嵌入变量

ngx_http_auth_jwt_module 模块支持嵌入变量。

$jwt_header_名称
返回指定 JOSE 标头 的值。
$jwt_claim_名称
返回指定 JWT 声明 的值。

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

使用 JWE 加密的令牌的变量值仅在 访问 阶段解密后可用。

$jwt_payload
返回 nestedencrypted 令牌 (1.21.2) 的已解密顶层有效负载。对于嵌套令牌,返回封闭的 JWS 令牌。对于加密令牌,返回包含声明的 JSON。