首页 › weekly › 给应用装门禁:8个开源认证神器

给应用装门禁:8个开源认证神器

本期发掘思路

每一个应用,无论炫不炫,最终都要回答同一个问题:你是谁?凭什么进来?这一期我们不挖新奇的玩具,专挖「门禁」——身份认证与授权这个所有软件都绕不开、 commercial 产品(Auth0、Clerk、Okta)按月收重税的地带。老牌王者 Keycloak 功能全但重得像一头大象,本期刻意绕开它,选了 8 个更锋利的替代品:从代码级框架、完整 IdP 平台、网关轻量方案到授权策略引擎,覆盖「门禁」的四个层级,其中半数都自带清晰的商业闭环。

数据说明:本期撰写环境未能联网实时核对,文中 Star 数一律用「量级」表述(万级≈1万以上,数千≈2000–9999),最近更新以「长期活跃」等定性描述代替,精确数字请以仓库页面为准。


1. Better Auth — 把认证写成一行 import

仓库: better-auth/better-auth | Star 量级:万级(TypeScript 圈近一年增速最快的认证库之一)| 状态:长期活跃

一句话定位:TypeScript 全栈开发者的「自带数据库」认证框架,专治 Auth0 的账单和 NextAuth 的配置地狱。

Better Auth 的切入点很毒:Clerk 好用但数据在别人手里,NextAuth 灵活但每接一个登录方式都要重读一遍文档。它选择中间路线——框架无关(Next.js、Nuxt、SvelteKit、SolidStart 通吃),但数据落在你自己的数据库里(Drizzle、Prisma、Kysely、MongoDB 都能接),核心只暴露一个 auth 实例。两步验证、Passkey、邮箱魔法链接、组织与成员管理、管理员后台,全部以官方插件形式即插即用,插件 API 是公开的,社区插件生态已经滚起来了。

最聪明的设计是数据库即真相源:会话、用户、组织全是普通表,你可以直接写 SQL 关联业务数据,不用钻 SDK 的黑盒。这对要做数据报表和风控的团队是决定性优势。

2. Authentik — 自托管世界的 Okta

仓库: goauthentik/authentik | Star 量级:万级 | 状态:长期活跃,商业公司全职维护

一句话定位:开箱即用的完整身份平台——一个顶 Keycloak 七成功能、却轻好几个量级的自托管 IdP。

Authentik 的核心抽象是 Provider(OIDC / SAML / LDAP / RADIUS / 代理)和 Flow(可编排的登录流程)。前者意味着它不只给自己的 Web 应用发凭证:老系统只会说 LDAP?起一个 LDAP Provider 挂上去。某商业软件只认 SAML?点几下配置完事。后者意味着登录页的行为——要不要二次验证、哪些用户组跳过、失败几次锁定——全部可以在 Web 界面里用拖拽式策略编排出来,不用改代码。

杀手锏是 Forward Auth 模式:配合 Traefik、nginx、Caddy,给任何没有登录功能的老应用「外挂」一整套认证。内网那台裸奔了五年的打印机管理后台,五分钟就能套上门禁。商业公司出企业版,托管、支持、SCIM 都收费,社区版功能完整,这条路径已被验证。

3. Zitadel — 为多租户而生的 Auth0 平替

仓库: zitadel/zitadel | Star 量级:万级 | 状态:长期活跃

一句话定位:Go 写的云原生身份平台,把「多租户」做成了第一公民——做 B2B SaaS 的团队看一眼就会心动。

大多数开源 IdP 谈多租户都要靠命名约定和强拗的目录结构硬凑,Zitadel 从数据模型层面就把 Organization(组织)做成了顶层的隔离单元:每个客户组织有自己的用户、策略、品牌登录页和自定义域名。你的 SaaS 接入一百个企业客户,每个客户想用自己的 Logo、自己的密码策略、自己管理员,原生支持,不用写一行胶水代码。

工程底子也硬:Go 单二进制部署,资源占用克制;内置操作审计日志,出了安全事故能完整回放「谁在什么时候改了什么」;Actions 机制允许用 JavaScript 片段在认证流程里挂钩子做定制。官方同时提供云托管版,开源版与商业版功能边界清晰,属于「自用免费、做大付费」的典型。

4. Authelia — 反向代理的最佳门童

仓库: authelia/authelia | Star 量级:万级 | 状态:长期活跃

一句话定位:一个 Go 单二进制的认证网关,让任何躲在反向代理后面的应用瞬间拥有 2FA。

Authelia 不想做完整的 IdP,它只想做好一件事:站在 Traefik / nginx / Caddy 后面,对每个请求做 forward-auth 验证。没有登录页的应用?它补登录页。应用分不清谁能进哪个路径?它的规则引擎可以按域名、路径、用户组、IP 网段精细放行——/admin 只许管理员组进,家里内网段免登录,外部访问强制二次验证,全在一个 YAML 里说清楚。

双因素支持 TOTP 和 WebAuthn 硬件密钥,会话可放 Redis 做集群。它自己不管用户目录,可以直接对接 LDAP(和本期第 8 位的 lldap 是社区公认的经典组合拳:lldap 管用户,Authelia 管验证),也可以用最简单的 YAML 文件起步。整个项目没有数据库依赖的包袱,备份就是备份一个目录。

5. Pocket ID — 小而美①:五分钟上线的极简 SSO

仓库: pocket-id/pocket-id | Star 量级:数千(自托管社区口碑发酵极快)| 状态:活跃

一句话定位:只支持 Passkey 的 OIDC Provider,一个二进制 + SQLite,可能是世界上最省心的自托管 SSO。

homelab 玩家的经典困境:家里二十个自托管应用(Jellyfin、Grafana、Uptime Kuma……),每个都有独立账号,而 Authentik、Keycloak 对这个场景来说重得离谱。Pocket ID 的产品哲学是做减法做到极致——登录方式只有 Passkey(生物识别/硬件密钥),协议只说 OIDC,存储只用 SQLite,部署只有一个容器。没有 LDAP、没有 SAML、没有复杂 Flow,就意味着没有学习曲线:五分钟从拉镜像到给第一个应用接上「用指纹登录」。

它把「够用」两个字打磨到了工业级:Web 界面管理用户和 OIDC 客户端、一键生成应用接入配置、支持多管理员。在 r/selfhosted 社区被反复安利,是近年「小工具吃掉大平台边角市场」的标准样本——大平台做加法,它靠减法立足。

6. Ory Kratos — 拆开卖的认证发动机

仓库: ory/kratos | Star 量级:万级(Ory 全家桶合计声势更大)| 状态:长期活跃

一句话定位:无头(headless)身份服务器——不给界面、不绑框架,把注册、登录、找回密码全部变成干净 API。

前面几个项目都自带登录页,Kratos 偏不。它把身份生命周期拆成一组 REST API:注册流、登录流、资料修改、邮箱验证、账号恢复、会话管理,每个 Flow 都返回结构化的 UI 节点,前端爱用什么渲染就用什么渲染——React 也好、Flutter 也好、小程序也好,认证体验完全由你的设计师说了算。社交登录(OIDC 联合登录)、WebAuthn、多因素全部内建。

这条路注定不如一体化方案亲民,但天花板高得多:当你的产品有 App、有小程序、有开放 API,任何「自带页面」的方案都会变成妥协,Kratos 这类 headless 组件才是正解。它背后是 Ory 全家桶:Hydra 管 OAuth2、Keto 管授权、Oathkeeper 管网关,官方提供商业云服务。适合把它当「认证中台」的地基。

7. OpenFGA — 把「谁能干什么」写成数学

仓库: openfga/openfga | Star 量级:万级边缘、数千级增长 | 状态:长期活跃,已进入 CNCF 沙箱孵化

一句话定位:源自 Google Zanzibar 论文的细粒度授权引擎,专治「权限系统写成了意大利面」。

前面七个解决「你是谁」(认证),OpenFGA 解决「你能干什么」(授权)——这是被绝大多数项目欠债最多的地方。传统 RBAC 在「文档所有者可以分享、分享对象可以转发、组织管理员可以撤销」这种关系嵌套面前土崩瓦解,最后 everyone 都在业务代码里写满 if user.role == ...。OpenFGA 用关系元组(tuple)+ 一门专用 DSL 来建模:授权关系变成可以查询的数据,check(user:anne, viewer, doc:1) 一次调用出结论,继承、传递、嵌套全部由引擎在图上推导。

它出身名门——Auth0(现 Okta)把自己的 FGA 引擎开源而成,Go 实现,横向可扩展,是少数经受过大规模生产检验的开源授权方案。审计能力是隐藏彩蛋:任何一次授权决策都能展开成完整的关系路径,给合规检查留了活口。

8. lldap — 小而美②:给老应用一个用户目录

仓库: lldap/lldap | Star 量级:数千 | 状态:活跃

一句话定位:Rust 写的轻量 LDAP 服务器,自带 Web 管理界面,是 homelab 认证拼图的最后一块。

大量软件至今只会一种语言:LDAP。Jellyfin、Gitea、Nextcloud、部分 NAS 和打印机都支持「LDAP 登录」,但正经 LDAP 服务器(OpenLDAP)的配置复杂度劝退了无数人。lldap 的思路是:把 LDAP 协议做薄,底下用 SQLite 存数据,上面挂一个现代 Web UI——建用户、拉分组、改密码全在浏览器里点两下完成,同时完整说 LDAP 方言,让那些老应用无缝接入。

它不追求成为 IdP:没有 SAML,OIDC 也只做有限支持,安心当一个「用户目录」。与 Authelia 组成社区经典搭档:lldap 管账号,Authelia 管验证和 2FA,反向代理管入口,三件套凑齐了整个内网门禁,内存占用低到树莓派都能跑。Rust 实现带来极小的攻击面和部署体积,单容器即起。


横向对比

仓库 层级 语言 Star 量级 上手难度 典型场景
Better Auth 代码框架 TypeScript 万级 ⭐⭐ TS 全栈 SaaS
Authentik 完整平台 Python/Go 万级 ⭐⭐⭐ 中企业统一 SSO
Zitadel 完整平台 Go/Angular 万级 ⭐⭐⭐ 多租户 B2B SaaS
Authelia 网关门禁 Go 万级 ⭐⭐⭐ 反代后 2FA
Pocket ID 网关轻量 Go/SQLite 数千 ⭐ homelab 极简 SSO
Ory Kratos 无头组件 Go 万级 ⭐⭐⭐⭐ 多端账号中台
OpenFGA 授权引擎 Go 数千–万级 ⭐⭐⭐⭐ 细粒度权限
lldap 用户目录 Rust 数千 ⭐⭐ 遗留系统接 LDAP

全景图

mindmap
  root((开源身份门禁))
    代码框架
      Better Auth
      Ory Kratos
    完整平台
      Authentik
      Zitadel
    轻量网关
      Authelia
      Pocket ID
      lldap
    授权引擎
      OpenFGA

本期之最

参考来源

  1. better-auth/better-auth — Better Auth 官方仓库,README 含框架支持与插件列表
  2. goauthentik/authentik — Authentik 官方仓库,Provider 与 Flow 架构说明
  3. zitadel/zitadel — Zitadel 官方仓库,多租户与 Actions 机制
  4. openfga/openfga — OpenFGA 官方仓库,Zanzibar 模型与 DSL 文档
  5. pocket-id/pocket-id — Pocket ID 官方仓库,Passkey-only 设计说明

再次提醒:本期所有 Star 数为量级估算、未联网实时核对,具体数字以各仓库页面当日显示为准。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入