gpt4 book ai didi

来自 JWT token 的解码值限制 NGINX 速率

转载 作者:行者123 更新时间:2023-12-03 14:52:42 28 4
gpt4 key购买 nike

我有一个关于 NGINX 速率限制的问题。
是否可以根据 JWT token 的解码值进行速率限制?我在文档中找不到任何这样的信息。
或者即使有一种通过创建纯自定义变量(使用 LuaJIT)来进行速率限制的方法,该变量将从我解码的 JWT 中分配一个值——也可以完成这项工作。
问题是 limit_req模块似乎在请求到达 luaJIT 阶段之前执行,所以已经太晚了!
一个解决方案将不胜感激。

最佳答案

您可能知道速率限制是通过唯一的 IP 地址应用以获得最佳结果,您应该使用唯一的 jwt 值或 token 来限制速率。
您可以遵循以下 3 种方法中的任何一种

  • 方法

  • 可以直接在limit_req_zone中使用jwt token。
    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;
    }
    ...
    }
  • 方法

  • 您可以在请求 header (如 http_x_jwt_decode_value)中从前端发送解码的 jwt 值,然后您可以在 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 token 并将其分配给变量,然后使用它来限制速率。
    描述:在这里,我只是解码了 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 token 的解码值限制 NGINX 速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64263895/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com