NGINX速率由JWT令牌的解码值限制



我有一个关于NGINX速率限制的问题。

是否可以根据JWT令牌的解码值进行速率限制?我在文档中找不到这样的信息。

或者,即使有一种方法可以通过创建纯自定义变量(使用LuaJIT(来进行速率限制,该变量将被分配一个来自我解码的JWT的值,也可以完成这项工作。问题是limit_req模块似乎在请求到达luaJIT阶段之前就执行了,所以已经太晚了!

我们将不胜感激。

正如您可能知道的,速率限制是通过唯一的ip地址应用的,为了获得最佳结果,您应该使用唯一的jwt值或令牌来速率限制。

你可以遵循以下3种方法中的任何一种

  1. 方法

您可以直接在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;
}
...
}
  1. 方法

您可以在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;
}
...
}
  1. 方法

您可以通过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授权

最新更新