基于Ollama离线模型的API网关鉴权插件开发与请求转发配置指南

文章导读
如果要把本地模型接在 API 网关上做鉴权判断,核心不是让模型直接处理 token,而是把“请求特征、安全策略意图、模型输出格式”三者串起来,作为原有鉴权链路上的补充判断。下面的步骤按前置环境、插件实现、转发配置、验证和回退五块展开,都基于本地可复现的 HTTP 调用,不绑定特定网关厂商。
📋 目录
  1. 一 前置条件
  2. 二 插件核心:调用 Ollama 做语义判断
  3. 三 请求转发配置
  4. 四 验证步骤
  5. 五 失败回退
A A

如果要把本地模型接在 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 才继续;其他任何输出都不应该直接放行。不要把模型当搜索引擎,只让它做分类。

基于Ollama离线模型的API网关鉴权插件开发与请求转发配置指南

以 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,可能泄露敏感数据。建议只传请求方法、路径、鉴权字段前缀、请求体大小或指定字段摘要。这个“输入裁剪”需要你按业务字段自行设计。

基于Ollama离线模型的API网关鉴权插件开发与请求转发配置指南

请求转发配置

鉴权通过后,网关需要把请求转发到后端业务服务。以 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离线模型的API网关鉴权插件开发与请求转发配置指南
  1. 确认 Ollama 离线接口可用,上面 curl 示例返回正常的 JSON。
  2. 在插件里打印输入摘要和模型输出,响应头里加 X-Auth-Model-Result 字段,便于查询。
  3. 构造一个明确违例的请求(例如路径包含 /admin 且无内部标志),应返回 403。
  4. 构造正常请求,应返回后端真实响应。
  5. 停掉 Ollama 进程,再次发送正常请求,观察网关是否按回退策略执行。

这一条验证必须做,因为模型离线不等于服务进程永远在线。

失败回退

Ollama 推理属于额外依赖,建议配置超时和熔断。参考做法:连续 3 次调用超时或返回非 200,插件就不再调用模型,改用“仅原鉴权”策略,并记录 alarm 日志。如果安全策略要求模型不可用就拒绝,则直接返回 503;如果模型只是辅助,建议返回“原鉴权结果放行”。这里没有绝对最优,需要结合网关已有鉴权强度决定,并在部署前用 chaos 测试验证一次。