如何配置 APISIX 网关插件实现 JWT 鉴权与限流同时进行?

文章导读
在 APISIX 中,直接在同一个 Route 上同时启用 jwt-auth 和限流插件即可实现,重点在于插件执行顺序和限流维度的选择,通常建议先鉴权再限流,以便针对用户身份进行控制。
📋 目录
  1. 步骤一:创建 Consumer 配置
  2. 步骤二:生成 JWT Token
  3. 步骤三:配置路由与插件
  4. 步骤四:验证是否生效
  5. 常见坑与排查
  6. 参考来源
A A

在 APISIX 中,直接在同一个 Route 上同时启用 jwt-auth 和限流插件即可实现,重点在于插件执行顺序和限流维度的选择,通常建议先鉴权再限流,以便针对用户身份进行控制。

先说结论:配置本身不冲突,但需注意插件优先级和 Consumer 绑定,否则可能导致限流无效或鉴权被绕过。

  • 适合:需要对已登录用户进行精细化流量控制的场景
  • 先准备:确保已创建对应的 Consumer 并配置好密钥
  • 验收:通过携带或不携带 Token 请求,观察状态码和限流 headers

步骤一:创建 Consumer 配置

jwt-auth 插件强依赖 Consumer 对象存储密钥信息。必须先创建 Consumer,否则即使路由启用了插件也无法通过鉴权。以下命令创建名为 jack 的消费者,并配置 key 和 secret。

curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-X PUT \
-d '{
  "username": "jack",
  "plugins": {
    "jwt-auth": {
      "key": "user-key",
      "secret": "my-secret-key"
    }
  }
}'

注意:secret 将用于签名 JWT Token,请妥善保管。key 用于标识用户,通常放在 Token 的 header 或 payload 中供插件识别。

如何配置 APISIX 网关插件实现 JWT 鉴权与限流同时进行?

步骤二:生成 JWT Token

由于 jwt-auth 需要验证签名,你需要使用上一步配置的 secret 生成 Token。可以使用在线工具(如 jwt.io)或命令行工具。

使用 jwt.io 生成示例:

  1. 打开 jwt.io
  2. 在 Header 中确保 alg 为 HS256。
  3. 在 Payload 中建议包含 sub 字段(例如 "jack")。
  4. 在 Verify Signature 区域,将 Secret 设置为上一步配置的 my-secret-key
  5. 复制生成的 Encoded 字符串作为 Token。

步骤三:配置路由与插件

创建 Route 并绑定插件。limit-count 的 key_type 设为 consumer 可针对用户限流,设为 remote_addr 则针对 IP 限流。此处演示针对用户限流。

如何配置 APISIX 网关插件实现 JWT 鉴权与限流同时进行?
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-X PUT \
-d '{
  "uri": "/hello",
  "plugins": {
    "jwt-auth": {},
    "limit-count": {
      "count": 5,
      "time_window": 60,
      "rejected_code": 503,
      "key_type": "consumer"
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "127.0.0.1:8080": 1
    }
  }
}'

步骤四:验证是否生效

使用 curl 发送请求,观察不同场景下的响应状态码。

1. 不带 Token 请求(应返回 401):

如何配置 APISIX 网关插件实现 JWT 鉴权与限流同时进行?
curl -i http://127.0.0.1:9080/hello

2. 带合法 Token 请求(应返回 200):

curl -i http://127.0.0.1:9080/hello \
-H "Authorization: Bearer <你的 JWT Token>"

3. 触发限流(应返回 503):

连续发送超过 5 次合法请求,第 6 次应被拦截。

for i in {1..6}; do curl -i http://127.0.0.1:9080/hello -H "Authorization: Bearer <你的 JWT Token>"; done

常见坑与排查

  • 忘记创建 Consumer:jwt-auth 插件启用后,若请求携带 Token 但对应 Consumer 不存在或 key 不匹配,会鉴权失败返回 401。
  • Secret 不匹配:生成 Token 使用的 secret 必须与 Consumer 配置中的 secret 完全一致,包括大小写。
  • 限流维度错误:若 key_type 设为 remote_addr,则无法区分同一 IP 下的不同用户,所有该 IP 请求共享配额。
  • 插件执行阶段:若发现限流未生效,检查插件执行阶段,确保 limit-count 在 jwt-auth 之后或独立运行,通常默认顺序即可。

参考来源

  • Apache APISIX 官方文档 - 插件列表,URL: https://apisix.apache.org/docs/apisix/plugins/
  • Apache APISIX 官方文档 - jwt-auth 插件,URL: https://apisix.apache.org/docs/apisix/plugins/jwt-auth/