个人需求
这个的诞生场景主要是想在教室白嫖网管会机子上面跑的模型做一些翻译之类的工作,但是远程连到我的电脑上面不太优雅,可是ollama自身不带有鉴权所以直接公网裸奔还是太超前了,网管会又想要all in authentik,于是有了这个方案
整体架构
主要想法就是:请求->cloudflare tunnel->内网跑了FastAPI的docker容器->向authentik走ldap->转发到运行ollama的虚拟机
最开始的构想
其实最开始我想得比较简单,打算直接利用 Authentik 的 API Token 机制
创建一个专门的 Service Account
给这个账户生成一个 API Token
FastAPI 拿着这个 Token 去请求 Authentik 的 /api/v3/core/users/me/ 接口,如果返回 200 就说明 Token 有效
但是:
- Authentik 的 App Password(应用密码)默认没有 API 访问权限,会报 403;而赋予 API 权限又容易给得太大
- App Password 本质上是设计给 Basic Auth 用的,但 Authentik 的 API 接口偏偏不支持 Basic Auth 验证,只认 Bearer Token
- 客户端,通常只给你一个API Key的填空框。如果我们用 API Token 方案,就没法灵活地区分“是谁在用”,除非给每个人都硬编码一个网关。
最后还是LDAP:
- 用户名 + 密码好
- 兼容app password
- 在 API Key 里填入 username:password 的格式,FastAPI 自动切割并去 LDAP 验证
实现
就写了一个FastAPI然后拦Authorization: Bearer按照第一个冒号切割,docker部署进去
Token缓存30分钟(可以在compose里面设置)
运行结果

针不戳啊针不戳