我有一个关于NGINX速率限制的问题。
是否可以根据JWT令牌的解码值进行速率限制?我在文档中找不到这样的信息。
或者,即使有一种方法可以通过创建纯自定义变量(使用LuaJIT(来进行速率限制,该变量将被分配一个来自我解码的JWT的值,也可以完成这项工作。问题是limit_req
模块似乎在请求到达luaJIT阶段之前就执行了,所以已经太晚了!
我们将不胜感激。
正如您可能知道的,速率限制是通过唯一的ip地址应用的,为了获得最佳结果,您应该使用唯一的jwt值或令牌来速率限制。
你可以遵循以下3种方法中的任何一种
- 方法
您可以直接在limit_req_zone中使用jwt令牌。
http {
...
limit_req_zone $http_authorization zone=req_zone:10m rate=5r/s;
}
conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
if ($http_authorization = "") {
return 403;
}
location /jwt {
limit_req zone=req_zone burst=10 nodelay;
return 200 $http_authorization;
}
...
}
- 方法
您可以在reqest头中从前端发送解码的jwt值,如http_x_jwt_decode_value,然后您可以在limit_req_zone中使用它。
http {
...
limit_req_zone $http_x_jwt_decode_value zone=req_zone:10m rate=5r/s;
}
conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
if ($http_x_jwt_decode_value = "") {
return 403;
}
location /jwt {
limit_req zone=req_zone burst=10 nodelay;
return 200 $http_x_jwt_decode_value;
}
...
}
- 方法
您可以通过njs javascript模块、perl模块或lua模块解码nginx中的jwt令牌,并将其分配给变量,然后将其用于速率限制。
描述:这里我刚刚解码了jwt值,并检查了它是否为空,您可以使用它来处理和jwt解码的值。
jwt_example.js
function jwt(data) {
var parts = data.split('.').slice(0,2)
.map(v=>String.bytesFrom(v, 'base64url'))
.map(JSON.parse);
return { headers:parts[0], payload: parts[1] };
}
function jwt_payload_sub(r) {
return jwt(r.headersIn.Authorization.slice(7)).payload.sub;
}
export default {jwt_payload_sub}
nginx.conf
# njs module
load_module modules/ngx_http_js_module.so;
http {
...
include /etc/nginx/conf.d/*.conf;
js_import main from jwt_example.js;
js_set $jwt_payload_sub main.jwt_payload_sub;
limit_req_zone $jwt_payload_sub zone=req_zone:10m rate=5r/s;
}
conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
if ($jwt_payload_sub = "") {
return 403;
}
location /jwt {
limit_req zone=req_zone burst=10 nodelay;
return 200 $jwt_payload_sub;
}
...
}
JWT Auth for Nginx
nginx-jwt
是Nginx服务器(运行HttpLuaModule
(的Lua脚本,它将允许您在现有的一组HTTP服务之前使用Nginx作为反向代理,并使用授权请求标头中的可信JSON Web令牌(JWT(来保护它们(身份验证/授权(,而无需对支持服务本身进行很少或根本不进行更改。
重要信息:nginx-jwt
是一个Lua脚本,设计用于在安装了HttpLuaModule
的Nginx服务器上运行。但最终它的依赖性需要Nginx的OpenResty
分布中可用的组件。因此,建议您使用OpenResty
作为您的Nginx服务器,并且这些说明做出了这种假设。
配置
目前,nginx-jwt只支持对称密钥(alg=hs256(,这就是为什么你需要在下面用共享的jwt密钥来配置你的服务器。
1.导出Nginx主机上的JWT_SECRET环境变量,将其设置为JWT机密。然后将其暴露给Nginx服务器:
# nginx.conf:
env JWT_SECRET;
2.如果您的JWT机密是Base64(URL安全(编码的,请在Nginx主机上导出JWT_secret_is_Base64_encoded环境变量,将其设置为true。然后将其暴露给Nginx服务器:
# nginx.conf:
env JWT_SECRET_IS_BASE64_ENCODED;
Nginx JWT授权