在React微服务架构中,API网关的安全配置是重中之重。最近在部署Kong作为API网关时,踩了一个关于JWT认证的坑,分享给大家避免重蹈覆辙。
问题场景:使用Kong + React微服务架构,需要对所有API请求进行JWT认证。最初配置了以下路由规则:
routes:
- name: api-route
paths: [ "/api/*" ]
protocols: [ "http", "https" ]
methods: [ "GET", "POST" ]
plugins:
- name: jwt
config:
claim_to_verify: "iat"
key_claim_name: "iss"
secret_is_base64_encoded: false
踩坑过程:部署后发现所有请求都返回401,排查发现是JWT token中的iss字段不匹配。原来React前端在生成token时,使用的是"app"作为iss,而网关配置中却要求验证"kong"。通过以下步骤复现问题:
- 前端生成token时:
jwt.sign({iss: "app"}, secret) - 网关验证时:
config.key_claim_name: "iss"且config.claim_to_verify: "iat" - 结果:验证失败,因为网关期望的iss值和实际不一致
解决方案:
- 方法一:修改前端token生成逻辑,使用统一的iss值
- 方法二:在网关中配置正确的iss白名单
plugins:
- name: jwt
config:
claim_to_verify: "iat"
key_claim_name: "iss"
secret_is_base64_encoded: false
allowed_clock_skew: 300
run_on_preflight: true
经验总结:
- 安全配置必须前后端统一约定字段
- 建议添加
allowed_clock_skew参数避免时钟不同步问题 - 实际部署中要先在测试环境验证token格式再上线
- 通过Kong Admin API可以动态查看插件状态,便于调试

讨论