---
title: "功能 — FoxAuth"
description: "全部授权类型、规范与控制：带 PKCE 的 OAuth 2.1、DPoP、PAR、FAPI、CIBA 与 mTLS，可审计的控制台，以及 MCP 服务器授权。"
canonical: "https://foxauth.dev/zh-cn/features/"
lastmod: "2026-10-12T23:12:26+03:00"
---
功能
功能一应俱全，大部分默认关闭。
FoxAuth 只发布一个服务器，不分功能版本。带 PKCE 的授权码流程和 OpenID Connect 从首次启动起就可用，其余大多数功能都在一个具名开关之后等待启用。实际上，你的攻击面就是你真正要求开启的那些功能。每张卡片都会注明该功能是首次启动即开启，还是等待其开关。
下面每个开关都链接到设置参考中的对应条目；该参考由代码生成，写明了默认值和后果。
快速开始设置参考

协议
OAuth 2.1 客户端能请求的每一种授权类型。
授权类型与端点。带 PKCE 的授权码流程和 OpenID Connect 始终开启；其余大多数需要打开开关。

带 PKCE 的授权码流程
按照 OAuth 2.1 的要求，每个客户端都必须使用 PKCE，无论是公开客户端还是机密客户端。重定向 URI 精确匹配。
RFC 7636

OpenID Connect Core 1.0
ID 令牌、UserInfo 端点和发现机制，支持标准声明集和成对主体标识符。
OIDC Core 1.0

颁发者标识
每个授权响应都携带 iss，客户端不会被诱骗接受另一个颁发者的授权码。
RFC 9207

资源指示符
用 resource 参数限定令牌的受众，并在资源服务器端校验。默认开启。
resourceIndicators.enabledRFC 8707

客户端凭据授权
机器对机器的令牌，不涉及最终用户，scope 按客户端限定。
clientCredentials.enabled

刷新令牌授权
长期会话，支持轮换和重用检测。一旦重放令牌，整个授权都会被撤销。默认开启：只要 offline_access 是受支持的 scope 就会提供。
scopes

设备授权
在电视或命令行工具上登录：到另一台设备上输入用户码即可。
deviceFlow.enabledRFC 8628

CIBA
客户端发起的后台通道认证：客户端发起请求，用户在带外完成批准。
ciba.enabledCIBA Core 1.0

推送授权请求
客户端先把请求提交给服务器，浏览器中只传递一个 request_uri。
par.enabledRFC 9126

请求对象
签名的 request 和 request_uri 参数，让授权请求本身受到完整性保护。
requestObjects.enabled

JARM
以 JWT 保护的授权响应，经过签名，并可选加密。
responseMode.jwt.enabledJARM

富授权请求
用细粒度的 authorization_details 代替 scope 字符串，适用于支付等场景。
richAuthorizationRequests.enabledRFC 9396

令牌内省
资源服务器向颁发者询问某个令牌是否仍然有效，以及它携带了什么。
introspection.enabledRFC 7662

JWT 格式的内省响应
签名的内省响应，适合需要证明自己得到了什么答复的资源服务器。
jwtIntrospection.enabledRFC 9701

令牌撤销
客户端撤销不再需要的访问令牌或刷新令牌。
revocation.enabledRFC 7009

签名的 UserInfo 响应
以签名的 JWT 而非普通 JSON 返回 UserInfo。
jwtUserinfo.enabled

claims 参数
按请求选择声明，包括必需声明（essential claims）和 acr 请求。
claimsParameter.enabled

RP 发起的登出
由客户端结束会话，并带有确认步骤，单凭一个链接无法悄悄让用户登出。默认开启。
rpInitiatedLogout.enabled

后台通道登出
会话结束时，以服务器到服务器的方式通知该会话的每个客户端。
backchannelLogout.enabled

安全
发送方约束，以及默认已开启的防护。
银行级安全规范是开关，不是单独的版本。列表中的其余各项从首次启动起就已开启。

DPoP
发送方约束的访问令牌和刷新令牌，支持服务器 nonce，因此仅仅盗得令牌并不够用。
dpop.enabledRFC 9449

mTLS 客户端认证
用客户端证书进行认证，并签发与证书绑定的访问令牌。
mTLS.enabledRFC 8705

FAPI 规范行为
Financial-grade API 规范要求的更严格检查，一个开关即可启用。
fapi.enabled

令牌与响应加密
使用客户端注册的密钥加密 ID 令牌、UserInfo 和 JARM 响应。
encryption.enabled

TOTP 第二因素
按用户桶启用的基于时间的一次性密码，也可以强制用于管理控制台。
RFC 6238

成对主体标识符
每个扇区（sector）使用不同的 sub，盐值取自数据库，两个依赖方无法关联同一个用户。

登录暴力破解节流
按身份持久化失败计数，锁定时间逐级递增。因节流而被拒绝，看上去与密码错误完全一样。

按来源限流
按路由类别分级，默认开启，可配置可信代理的跳数。
rateLimit.enabled

由数据决定的 CORS
只有当拥有调用方客户端的项目列出某个来源时，该来源才可读取。没有任何通配符设置能把它打开。
cors.enabled

安全响应头
每个响应都带有 HSTS、Permissions-Policy、防框架嵌入和内容类型方面的保护。

基于 scope 的访问控制
按客户端强制执行 scope，在授权端点检查一次，在令牌端点再检查一次。

审计日志。记录在变更之前写入，存储层不提供更新或删除，因此记录写入后无法再被篡改。

管理
一套管理 API，三个入口。
控制台、HTTP API 和 MCP 工具都分发到同一组路由，因此各项检查和审计写入不会彼此脱节。

管理控制台
项目、OAuth 客户端、管理员及其所在的组、用户桶、最终用户、上游身份提供商、SCIM 连接、设置、SMTP 和签名密钥。每个页面都有自己的地址。可能让人无法登录或让应用出错的更改，会先告诉你影响到谁、涉及多少人，只有在你确认之后才会生效。

只追加的审计日志
每个改变状态的管理操作都会记录操作者、操作、目标和时间。记录在变更之前写入，且存储层没有任何更新或删除的途径。

按桶统计月活跃用户
每个桶都会统计它签发过令牌的用户，按 UTC 每月、每天各计一次，并区分本地登录、上游登录、续期和目录同步。已结束的月份不会再变，而且即使用户或桶被删除，历史数据仍然保留。Usage 页面把每个桶和拥有它的组并排列出，所以当你为其他团队或客户运行实例时，也能说清谁用了多少。

通过 MCP 进行管理
126 个工具以 OAuth 2.1 受保护资源的形式在 POST /mcp 上提供给 AI 智能体，高影响操作需要两次调用确认。
mcp.enabledRFC 9728

为你自己的 MCP 服务器提供授权
把第三方 MCP 服务器声明为某个项目的受保护资源，本服务器就会签发受众恰好是该资源的令牌，这里无需改代码，也无需重启。在拥有独立地址的桶中，声明不需要资源方提供任何东西——它可以是内部服务、运行在 localhost 上，甚至尚未部署——其他租户也可以声明同一个 URL，而不会影响你的声明。令牌默认是自包含的，资源方用所属桶公开的密钥即可验证，无需持有自己的凭据。
RFC 8707

客户端身份文档
值为 HTTPS URL 的 client_id，指向一份描述该客户端的 JSON 文档；按需获取并校验，从不存储。对于事先没有任何关系的客户端，MCP 授权规范首先列出的就是这种机制。
clientIdMetadataDocument.enabled

动态客户端注册
客户端可以自行注册，但须遵守注册策略。MCP 规范已弃用这种方式，转而推荐客户端身份文档。
registration.enabledRFC 7591

注册管理
使用注册访问令牌读取、更新和删除注册信息。
registrationManagement.enabledRFC 7592

存储在数据库中的客户端
客户端保存在服务器自己的存储中，可以通过控制台、API、动态注册或初始化脚本创建。没有静态客户端文件。

组所有权
项目和用户桶归某个组所有。除了成员身份，没有任何东西能授予访问权限，而且每个请求都会重新解析一次。一个桶可以连同使用它的项目一起转移到另一个组。

按路径或主机名寻址的桶
每个用户桶都是独立的颁发者，有自己的元数据和签名密钥，可以通过服务器下的某个路径或独立的主机名访问——二者选其一，不能同时使用。使用主机名时，浏览器可以按来源隔离该桶的登录 cookie，元数据也只发布在一个位置而不是两个；代价是你需要提供一条 DNS 记录和一张证书。更改地址是一项单独的操作：在破坏任何客户端之前，它会先告诉你哪些客户端会受影响。

删除桶可以撤销
删除会立即停用一个桶，并在 30 天后将其销毁。在此之前，桶里的任何东西都不会被销毁；恢复操作会把它找回来，所有会话和刷新令牌依然有效。

最终用户自助服务
按桶提供邮箱验证和密码重置，均带有尝试次数上限、冷却时间和一次性链接。

最终用户管理
可以邀请用户自己设置密码，可以手动把邮箱标记为已验证，也可以只让某人退出一个应用而不影响其他应用。最多可一次停用、启用、退出登录或删除 100 个用户，每个用户都有各自的审计记录。

使用 Google、Microsoft、Apple 或 GitHub 登录
按名称连接其中一个，控制台会告诉你需要在提供商那边做什么，以及要登记的确切回调地址；你只需填入对方签发的值。其他任何 OIDC 提供商都可以手动配置。按用户桶设置，因此每个租户使用自己的应用。“试登录”会在任何人依赖该提供商之前，先展示一次真实登录会产生什么结果；如果回调中的应答并非来自发起登录的那个颁发者，回调会拒绝它。管理员也可以通过你所在组织的身份提供商登录控制台。
federation.enabled

SCIM 2.0 用户同步
Microsoft Entra ID、Okta 或任何支持 SCIM 2.0 的目录，都可以创建、更新和删除桶中的用户和组。一次移除大量用户时，可以先暂缓执行、等待审核。被替换的旧密钥或静态令牌会继续有效，直到目录切换到新的凭据。
scim.enabledRFC 7644

签名密钥管理
每个拥有独立地址的桶都用自己的密钥签名，并发布在自己的 jwks_uri 上，因此一个租户的令牌永远无法在另一个租户的资源服务器上通过验证。拥有该桶的组可以一步完成密钥轮换——新密钥先发布、后签名，退役的密钥会一直保持发布，直到它签发的令牌过期——也可以立即吊销已泄露的密钥，此后由它签名的任何内容都无法再通过验证。实例级密钥集仍由超级管理员掌管。

设置按领域分面板。这里的开关与参考文档中记录的是同一个键；更改在保存之前会作为一份完整配置整体校验。

可扩展性
无需 fork 即可改变行为。
具名扩展点加上统一的适配器接口，你的改动应当能平稳度过升级。

31 个覆盖扩展点
账户查找、交互策略、刷新令牌轮换、资源解析、成对标识符、RAR 处理等，都可以在调用时替换。

可插拔存储
每个持久化模型都经过同一个适配器接口。随附的实现有：PostgreSQL、MongoDB 和 内存；由一个连接字符串决定使用哪一个。

可挂载的 Elysia 应用
导入这个应用，挂载到你自己的 Bun 服务中。没有初始化步骤——导入即启动。

内置登录与授权同意界面
基于 React 和 Ant Design 的页面，可以自定义主题，也可以通过交互策略整体替换。

运维
出问题时你需要的东西。
发布它，观察它，查清某个请求为什么失败。

已发布的容器镜像
ghcr.io/redfox-soft/oauth-server-ts，每个版本都有对应标签，另有 latest；附带一个会预配数据库结构的 Compose 文件。

服务器错误存储
内部故障会被记录下来，可以在控制台中查看。常规的客户端拒绝属于正确行为，从不出现在这里。
errorStore.enabled

可选的 Sentry 上报
上报完全不在请求路径上：故障只有在被判定为缺陷之后才会到达上报环节，因此响应不受任何影响。
sentry.enabled

看得懂的设置
每项服务器级设置都写明了类型、默认值和后果，并可在控制台中编辑。

机器可读的参考文档
端点、设置、管理 API、MCP 工具和环境变量的参考文档，都直接由代码本身生成。

下一步
和你现在用的方案比一比。
我们针对团队通常会拿来权衡的那些服务器，维护着一份基于事实、注明日期的对比。
已经在用别的方案？我们维护着与 Auth0、authentik、Keycloak、Ory Hydra 和 Zitadel 的对比，均注明日期和出处，并列出我们查阅过的页面及查阅日期。
全部对比定价
