api网关鉴权应前置到kong/apisix,避免在fastapi/flask中重复实现;kong插件须用lua编写,通过http调用python鉴权服务完成jwt校验与rbac判断。

API网关鉴权不该在Python服务里做
直接在每个 FastAPI/Flask 服务中写 Bearer 解析、JWT 校验、权限查库逻辑,等于把网关职责下放到业务层——既重复又难统一,还绕过流量控制和审计。Kong 和 APISIX 的核心价值,就是把鉴权提到最外层,让 Python 服务只专注业务。你写的 auth_required 装饰器,在网关面前只是摆设。
Kong 自定义插件必须用 Lua,但可调 Python 后端校验
Kong 不支持原生 Python 插件,所有插件必须用 Lua 编写。常见误区是试图在 kong/plugins/my-auth/handler.lua 里直接 import Python 模块——行不通。正确做法是:Lua 插件通过 httpc:request() 调用你部署好的 Python 鉴权服务(比如一个轻量 FastAPI 接口),把 Authorization 头、request_uri、consumer_id 等透传过去,由 Python 完成 JWT 解析、RBAC 判断、黑名单检查等复杂逻辑。
实操建议:
- Python 鉴权服务必须有低延迟(建议 @lru_cache 缓存公钥或用户权限快照
- 在 Kong 插件中设置超时:
timeout = 3000(毫秒),避免 Python 服务卡住整个请求流 - 不要在 Lua 中解析 JWT——没有可靠的 base64url 解码和签名验证库,交给 Python 做更稳
- 错误返回要明确:Python 服务返回
401(无效 token)或403(权限不足),Kong 插件据此调用kong.response.exit()
APISIX 的 Python Runner 插件真能写 Python,但限制极多
APISIX 通过 python-runner 支持运行 Python 代码,但它不是通用 Python 环境:不能 pip install 第三方包(如 PyJWT、requests),不支持多线程/协程,且只允许同步阻塞调用。你写的 auth.py 实际运行在受限子进程中,标准库仅开放 json、base64、hmac、time 等少数模块。
所以真实可用的方案只有两种:
- 纯内置函数校验:比如用
base64.b64decode+hmac.compare_digest做简单 API Key 签名,不依赖外部服务 - 转发到外部 Python 服务:和 Kong 一样,用
http.client(APISIX 内置)调你的http://auth-svc:8000/check,这是主流选择 - 别碰
os、subprocess、sqlite3——这些在 runner 中被禁用,会直接 crash worker
Python 服务收到的请求头已不可信,必须信任网关注入字段
一旦启用网关鉴权,你的 Flask/FastAPI 就不该再读 request.headers.get("Authorization")。Kong/APISIX 在鉴权通过后,会注入可信字段,比如:
- Kong:默认注入
X-Consumer-ID、X-Consumer-Username、X-Authenticated-Scope(如果你的插件设置了) - APISIX:可通过
vars或proxy_rewrite注入X-User-ID、X-Roles等自定义头 - Python 服务应只信任这些注入头,并基于它们做后续逻辑(如查用户资料、限流分组),而不是重新解析 token
- 务必在 Nginx 层或网关配置中移除原始
Authorization头再转发,防止客户端伪造
漏掉最后一点,就等于给攻击者留了 bypass 鉴权的后门——这个细节线上出过好几次生产事故。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











