You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带JWT认证的API请求缓存方案咨询

解决方案:缓存带JWT认证且需权限校验的API请求

好问题!针对你需要缓存带JWT认证且需校验userGroupID与URL中groupID匹配的API请求场景,Varnish、Nginx都完全支持,还有其他工具可选,下面给你详细拆解各方案:

Varnish 实现方案

Varnish可以通过**VCL(Varnish配置语言)**结合JVMOD扩展来实现JWT解析、权限校验和缓存逻辑,完全不需要请求到达PHP后端。

核心思路

  1. 从Authorization头中提取JWT令牌
  2. 解析JWT的Payload部分,取出userGroupID
  3. 从URL中捕获groupID(比如/groups/{groupID}/cars中的{groupID})
  4. 校验两个ID是否匹配,匹配则生成包含groupID的缓存键,触发缓存逻辑;不匹配则直接转发到PHP

示例VCL配置(需安装vmod-jwt扩展)

import jwt;

sub vcl_recv {
    # 提取Bearer令牌
    if (req.http.Authorization ~ "^Bearer ") {
        set req.http.X-JWT = regsub(req.http.Authorization, "^Bearer ", "");
        
        # 解析JWT Payload中的userGroupID
        set req.http.X-User-Group-ID = jwt.payload_get(req.http.X-JWT, "userGroupID");
        
        # 从URL中提取groupID(适配/groups/123/cars格式)
        set req.http.X-URL-Group-ID = regsub(req.url, "^/groups/([0-9a-zA-Z]+)/.*$", "\1");
        
        # 校验ID匹配,匹配则启用缓存
        if (req.http.X-User-Group-ID == req.http.X-URL-Group-ID) {
            # 缓存键加入groupID,确保不同组的缓存隔离
            set req.hash += req.http.X-URL-Group-ID;
            return (hash);
        }
    }
    
    # 不满足条件则直接转发到后端
    return (pass);
}

Nginx 实现方案

Nginx通过官方的ngx_http_auth_jwt_module模块(或第三方JWT模块)结合自身的proxy_cache功能,也能实现前端缓存+权限校验的需求。

核心思路

  1. 启用JWT认证模块,验证令牌有效性
  2. 从JWT Payload中提取userGroupID
  3. 用Nginx变量捕获URL中的groupID
  4. 校验两个ID匹配后,启用proxy_cache并生成带groupID的缓存键

示例Nginx配置

# 定义缓存池
proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=my_api_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    # ...其他配置
    
    location ~ ^/groups/([0-9a-zA-Z]+)/cars$ {
        # 验证JWT有效性(密钥文件需提前准备)
        auth_jwt "API Access";
        auth_jwt_key_file /etc/nginx/jwt_secret.key;
        
        # 提取JWT中的userGroupID到变量
        auth_jwt_set $user_group_id $jwt_claim_userGroupID;
        
        # 捕获URL中的groupID
        set $request_group_id $1;
        
        # 校验ID匹配,不匹配则返回403或直接转发
        if ($user_group_id != $request_group_id) {
            return 403;
        }
        
        # 配置缓存
        proxy_cache my_api_cache;
        proxy_cache_key "$host$request_uri$user_group_id";
        proxy_cache_valid 200 60m;
        
        # 转发到PHP后端
        proxy_pass http://your_php_backend;
    }
}

注意:ngx_http_auth_jwt_module需要Nginx 1.11.3及以上版本,编译时需添加--with-http_auth_jwt_module参数。

其他可行工具

如果觉得Varnish/Nginx的配置偏底层,还可以考虑以下API网关类工具,配置更偏向声明式:

  • Traefik:自带JWT认证中间件和缓存中间件,可以通过规则配置实现userGroupID与URL参数的校验,同时启用缓存,适配多种部署场景。
  • Kong:提供成熟的JWT插件和缓存插件,通过组合插件即可实现权限校验+缓存的逻辑,还有可视化管理界面,适合需要更多API管控功能的场景。

备选方案:PHP+Memcached

如果以上前端缓存方案都不想引入,在PHP中用Memcached实现缓存也是可行的,但需要注意:

  • 首先在PHP中解析JWT,验证userGroupID与URL中的groupID匹配
  • 匹配成功后,生成包含groupID和请求参数的唯一缓存键,先从Memcached读取缓存,存在则直接返回;不存在则执行业务逻辑,再将结果存入Memcached
  • 需做好缓存过期策略(比如设置合理的过期时间,数据更新时主动删除对应缓存)
  • 缺点是请求仍会到达PHP,性能上不如前端缓存直接返回高效,但实现简单,无需额外运维成本

内容的提问来源于stack exchange,提问作者Firze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:18:44