如果要把本地模型接在 API 网关上做鉴权判断,核心不是让模型直接处理 token,而是把“请求特征、安全策略意图、模型输出格式”三者串起来,作为原有鉴权链路上的补充判断。下面的步骤按前置环境、插件实现、转发配置、验证和回退五块展开,都基于本地可复现的 HTTP 调用,不绑定特定网关厂商。
前置条件
需要先准备以下环境:Ollama 服务已启动,并能离线加载目标模型;API 网关与 Ollama 之间可在内网直连;网关插件有发起 HTTP 请求的能力(例如 OpenResty 的 resty.http,或 APISIX 的 ext-plugin)。不要求模型很大,关键是推理延迟可控。建议先用 curl http://127.0.0.1:11434/api/tags 确认模型已就绪,返回的 models 列表中能找到目标模型名。
插件核心:调用 Ollama 做语义判断
插件放在原有鉴权(JWT、API Key 等)通过之后,只追加一层“风险判断”。调用 Ollama 的 /api/chat 接口,采用 0 温度、固定的系统提示词,让模型返回固定 token。下面是一个可直接用于手动测试的 curl 示例:
curl -s http://127.0.0.1:11434/api/chat -H "Content-Type: application/json" -d '{"model":"qwen2.5:7b","messages":[{"role":"system","content":"你是 API 网关鉴权助手。只输出 allow 或 deny,不解释原因。"},{"role":"user","content":"请求路径: /admin/config,请求方法: POST,请求头: Authorization: Bearer xxx,请求体摘要: {"enabled": true}"}],"stream":false,"options":{"temperature":0}}'响应里取 message.content 字段。在插件中,必须严格判断:只有 content 等于 allow 才继续;其他任何输出都不应该直接放行。不要把模型当搜索引擎,只让它做分类。
以 OpenResty 的 lua 插件为例,最小骨架如下:
local http = require("resty.http").new()
local res, err = http:request_uri("http://127.0.0.1:11434/api/chat", {
method = "POST",
headers = { ["Content-Type"] = "application/json" },
body = [[{...上方的请求体...}]],
connect_timeout = 200,
read_timeout = 2000
})
-- 解析 res.body,提取 message.content
if content ~= "allow" then
return ngx.exit(403)
end
-- 通过后继续后续转发注意:不要直接透传原始请求体给 Ollama,可能泄露敏感数据。建议只传请求方法、路径、鉴权字段前缀、请求体大小或指定字段摘要。这个“输入裁剪”需要你按业务字段自行设计。
请求转发配置
鉴权通过后,网关需要把请求转发到后端业务服务。以 Nginx 为例,可以先定义后端 upstream,再在 location 中执行插件逻辑:
upstream biz_backend {
server 127.0.0.1:8080;
}
server {
listen 9443 ssl;
location /api/ {
access_by_lua_block {
-- 将上面的“插件核心”逻辑放在这里
}
proxy_pass http://biz_backend;
proxy_set_header X-Auth-Model allow;
}
}如果你使用的网关不是 Nginx 系,思路一样:插件先调用 Ollama,返回 allow 后由网关内置路由转发到后端;不要把 Ollama 地址暴露给客户端,应该放在网关环境变量或配置中心。
验证步骤
建议按以下顺序验证:
- 确认 Ollama 离线接口可用,上面 curl 示例返回正常的 JSON。
- 在插件里打印输入摘要和模型输出,响应头里加
X-Auth-Model-Result字段,便于查询。 - 构造一个明确违例的请求(例如路径包含
/admin且无内部标志),应返回 403。 - 构造正常请求,应返回后端真实响应。
- 停掉 Ollama 进程,再次发送正常请求,观察网关是否按回退策略执行。
这一条验证必须做,因为模型离线不等于服务进程永远在线。
失败回退
Ollama 推理属于额外依赖,建议配置超时和熔断。参考做法:连续 3 次调用超时或返回非 200,插件就不再调用模型,改用“仅原鉴权”策略,并记录 alarm 日志。如果安全策略要求模型不可用就拒绝,则直接返回 503;如果模型只是辅助,建议返回“原鉴权结果放行”。这里没有绝对最优,需要结合网关已有鉴权强度决定,并在部署前用 chaos 测试验证一次。