协议
OAuth 2.1 客户端能请求的每一种授权类型。
授权类型与端点。带 PKCE 的授权码流程和 OpenID Connect 始终开启;其余大多数需要打开开关。
安全
发送方约束,以及默认已开启的防护。
银行级安全规范是开关,不是单独的版本。列表中的其余各项从首次启动起就已开启。
成对主体标识符
每个扇区(sector)使用不同的 sub,盐值取自数据库,两个依赖方无法关联同一个用户。
登录暴力破解节流
按身份持久化失败计数,锁定时间逐级递增。因节流而被拒绝,看上去与密码错误完全一样。
安全响应头
每个响应都带有 HSTS、Permissions-Policy、防框架嵌入和内容类型方面的保护。
基于 scope 的访问控制
按客户端强制执行 scope,在授权端点检查一次,在令牌端点再检查一次。

管理
一套管理 API,三个入口。
控制台、HTTP API 和 MCP 工具都分发到同一组路由,因此各项检查和审计写入不会彼此脱节。
管理控制台
项目、OAuth 客户端、管理员及其所在的组、用户桶、最终用户、上游身份提供商、SCIM 连接、设置、SMTP 和签名密钥。每个页面都有自己的地址。可能让人无法登录或让应用出错的更改,会先告诉你影响到谁、涉及多少人,只有在你确认之后才会生效。
只追加的审计日志
每个改变状态的管理操作都会记录操作者、操作、目标和时间。记录在变更之前写入,且存储层没有任何更新或删除的途径。
按桶统计月活跃用户
每个桶都会统计它签发过令牌的用户,按 UTC 每月、每天各计一次,并区分本地登录、上游登录、续期和目录同步。已结束的月份不会再变,而且即使用户或桶被删除,历史数据仍然保留。Usage 页面把每个桶和拥有它的组并排列出,所以当你为其他团队或客户运行实例时,也能说清谁用了多少。
为你自己的 MCP 服务器提供授权
把第三方 MCP 服务器声明为某个项目的受保护资源,本服务器就会签发受众恰好是该资源的令牌,这里无需改代码,也无需重启。在拥有独立地址的桶中,声明不需要资源方提供任何东西——它可以是内部服务、运行在 localhost 上,甚至尚未部署——其他租户也可以声明同一个 URL,而不会影响你的声明。令牌默认是自包含的,资源方用所属桶公开的密钥即可验证,无需持有自己的凭据。
客户端身份文档
值为 HTTPS URL 的 client_id,指向一份描述该客户端的 JSON 文档;按需获取并校验,从不存储。对于事先没有任何关系的客户端,MCP 授权规范首先列出的就是这种机制。
存储在数据库中的客户端
客户端保存在服务器自己的存储中,可以通过控制台、API、动态注册或初始化脚本创建。没有静态客户端文件。
组所有权
项目和用户桶归某个组所有。除了成员身份,没有任何东西能授予访问权限,而且每个请求都会重新解析一次。一个桶可以连同使用它的项目一起转移到另一个组。
按路径或主机名寻址的桶
每个用户桶都是独立的颁发者,有自己的元数据和签名密钥,可以通过服务器下的某个路径或独立的主机名访问——二者选其一,不能同时使用。使用主机名时,浏览器可以按来源隔离该桶的登录 cookie,元数据也只发布在一个位置而不是两个;代价是你需要提供一条 DNS 记录和一张证书。更改地址是一项单独的操作:在破坏任何客户端之前,它会先告诉你哪些客户端会受影响。
删除桶可以撤销
删除会立即停用一个桶,并在 30 天后将其销毁。在此之前,桶里的任何东西都不会被销毁;恢复操作会把它找回来,所有会话和刷新令牌依然有效。
最终用户自助服务
按桶提供邮箱验证和密码重置,均带有尝试次数上限、冷却时间和一次性链接。
最终用户管理
可以邀请用户自己设置密码,可以手动把邮箱标记为已验证,也可以只让某人退出一个应用而不影响其他应用。最多可一次停用、启用、退出登录或删除 100 个用户,每个用户都有各自的审计记录。
使用 Google、Microsoft、Apple 或 GitHub 登录
按名称连接其中一个,控制台会告诉你需要在提供商那边做什么,以及要登记的确切回调地址;你只需填入对方签发的值。其他任何 OIDC 提供商都可以手动配置。按用户桶设置,因此每个租户使用自己的应用。“试登录”会在任何人依赖该提供商之前,先展示一次真实登录会产生什么结果;如果回调中的应答并非来自发起登录的那个颁发者,回调会拒绝它。管理员也可以通过你所在组织的身份提供商登录控制台。
SCIM 2.0 用户同步
Microsoft Entra ID、Okta 或任何支持 SCIM 2.0 的目录,都可以创建、更新和删除桶中的用户和组。一次移除大量用户时,可以先暂缓执行、等待审核。被替换的旧密钥或静态令牌会继续有效,直到目录切换到新的凭据。
签名密钥管理
每个拥有独立地址的桶都用自己的密钥签名,并发布在自己的 jwks_uri 上,因此一个租户的令牌永远无法在另一个租户的资源服务器上通过验证。拥有该桶的组可以一步完成密钥轮换——新密钥先发布、后签名,退役的密钥会一直保持发布,直到它签发的令牌过期——也可以立即吊销已泄露的密钥,此后由它签名的任何内容都无法再通过验证。实例级密钥集仍由超级管理员掌管。

可扩展性
无需 fork 即可改变行为。
具名扩展点加上统一的适配器接口,你的改动应当能平稳度过升级。
31 个覆盖扩展点
账户查找、交互策略、刷新令牌轮换、资源解析、成对标识符、RAR 处理等,都可以在调用时替换。
可插拔存储
每个持久化模型都经过同一个适配器接口。随附的实现有:PostgreSQL、MongoDB 和 内存;由一个连接字符串决定使用哪一个。
可挂载的 Elysia 应用
导入这个应用,挂载到你自己的 Bun 服务中。没有初始化步骤——导入即启动。
内置登录与授权同意界面
基于 React 和 Ant Design 的页面,可以自定义主题,也可以通过交互策略整体替换。
运维
出问题时你需要的东西。
发布它,观察它,查清某个请求为什么失败。
已发布的容器镜像
ghcr.io/redfox-soft/oauth-server-ts,每个版本都有对应标签,另有 latest;附带一个会预配数据库结构的 Compose 文件。
看得懂的设置
每项服务器级设置都写明了类型、默认值和后果,并可在控制台中编辑。
机器可读的参考文档
端点、设置、管理 API、MCP 工具和环境变量的参考文档,都直接由代码本身生成。