Repository navigation
接口认成员的令牌,给 Agent 和自家应用用 - #346
Merged
Merged
Conversation
成员要能让自己的 Agent 以本人的身份用论坛,鼠钟这样的自家应用也要靠令牌拿资料(总体设计 §6.7)。这是第 1 步里接口的部分:鼠钟登录要用的 OAuth 建在它上面,设置页的界面、楼层旁标"Agent"和数据页按来源分开统计另开 PR。
- api_tokens 的 bot_user_id 改名 user_id,bot token 和成员的令牌共用一张表,账号是 bot 角色的是 bot token
- 成员的令牌只能以本人的身份用:带 X-Act-As、X-Operator 不行,版主和管理员的、bot 专用的和只能在网页上的接口返回 403 forbidden
- 能做的是本人的权限和令牌范围的交集,read 包含新加的 profile(GET /me 只要 profile);发帖、回复、编辑、互动和上传要 L3
- 通过令牌发的帖子、回复、表情回应和短评 via 记为 agent;每人每天最多 5 个帖子、30 条回复,每个令牌每分钟 60 次请求
- 90 天没用过就失效,封禁时和登录设备一起作废
- 新接口 GET、POST /me/tokens 和 DELETE /me/tokens/{id},只能在网页上用
- Agent 的搜索和阅读不计入搜索统计和浏览数,做的事也不算本人当天活跃
Merged
JunieXD
added a commit
that referenced
this pull request
Nov 6, 2026
Refs #336 鼠钟一期要用鼠洞账号登录(总体设计 §6.7,接口 §8.3)。这是路线图第 3 步 OAuth 里自家应用的一半,建在 #346 成员的令牌上。授权服务器的元数据、Agent 注册、Agent 的授权页和设置页的接入命令,之后和 MCP 一起做:鼠钟用固定的地址就能连上,用不到它们。 ## 改了什么 - 新表 `oauth_clients`(自家应用,只存密钥的 SHA-256)、`oauth_codes`(授权码,只存 SHA-256),`api_tokens` 加上 `client_id` - 后台加「应用」页,站长登记、修改、换密钥和停用自家应用;密钥只显示一次。接口是 `/admin/apps` 的四个,停用时它的令牌都标为撤销 - `/oauth/authorize` 页:自家应用不显示授权页 - 登录了的直接带着 `code`、`state` 和 `iss` 跳回 - 没登录的带 `prompt=none` 时带着 `error=login_required` 跳回,否则去 `/login?next=…`,用口令或 QQ 邮箱登录后回到授权页(链接登录在手机 QQ 里打开,回不到原来的浏览器) - 应用不存在、已停用或回调地址没登记时只在页面上报错,不跳回;其余错误按 OAuth 的格式带回给应用 - 页面背后是 `POST /api/v1/oauth/authorize`,只能在网页上调 - `POST /oauth/token`:用授权码、PKCE(S256)和密钥换令牌,密钥放在 Basic 认证里或表单里;返回和错误按 OAuth 的格式,带 `Cache-Control: no-store`。它在 CSRF 检查之前:应用的服务端调用时不带 Origin,靠密钥认 - 授权码 5 分钟有效,换的时候在一条 `DELETE … RETURNING` 里取出,对不上也用掉了;封禁时删掉这个人没换的码,过期的每天清理 - 每人在每个自家应用只有一个令牌,换新的时旧的作废。应用的令牌就是成员的令牌,范围、L3、限额和 90 天失效都照 #346 - `GET /me` 加上 `restriction`,鼠钟每小时用它刷新禁言状态 - 操作日志加上「登录应用」「登记应用」「修改应用」「更换应用密钥」 ## 怎么验证的 - `pnpm check` 通过:类型检查、lint、格式和 412 个测试。新加的 `server/modules/auth/oauth.test.ts` 有 8 个: - 换令牌,再用令牌取 `/me` 和禁言状态 - 授权码试一次就没了,回调地址和密钥对不上换不到 - 没登录时 `prompt=none` 带着 `login_required` 跳回,不带返回 `401` - 应用和回调地址不对时不跳回,范围和 PKCE 不对时带着错误跳回 - 每人一个令牌 - 封禁时没换的码作废(去掉这处改动时这个测试会失败) - 停用后令牌失效,只有站长能管 - `pnpm e2e` 通过,新加一个流程:站长在后台登记应用;登录了的打开授权页带着授权码回去;访客带 `prompt=none` 带着 `login_required` 回去,不带时去登录页 - 在本地的开发版上走了一遍访客登录:打开授权页到登录页,拿口令,用 `pnpm mock-bot code` 确认,回到授权页,带着授权码跳回;再用 `client_secret_post` 换到令牌,用它取到 `/me` - `pnpm phone-check` 看过 `/admin/apps`、它的修改状态和授权页的报错,没有超出屏幕的元素 ## 影响 - 插件:不受影响,bot token 和代操作没有改 - 前端:登录页认 `next`,只接受本站的路径 - 鼠钟:上线后站长在后台登记鼠钟,把 `client_id` 和密钥填进鼠钟的 `MOUSEHOLE_CLIENT_ID`、`MOUSEHOLE_CLIENT_SECRET`
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #336
成员要能让自己的 Agent 以本人的身份用论坛,鼠钟这样的自家应用也要靠令牌拿资料(总体设计 §6.7)。这是路线图第 1 步里接口的部分:鼠钟登录要用的 OAuth 建在它上面,接着另开 PR;设置页的界面、楼层旁标"Agent"和数据页按来源分开统计,之后再做。
改了什么
api_tokens的bot_user_id改名user_id,bot token 和成员的令牌共用一张表,账号是 bot 角色的是 bot tokenX-Act-As、X-Operator不行,版主和管理员的、bot 专用的和只能在网页上的接口返回403 forbiddenread包含新加的profile(GET /me只要profile);发帖、回复、编辑、互动和上传要 L3via记为agent;每人每天最多 5 个帖子、30 条回复,每个令牌每分钟 60 次请求GET、POST /me/tokens和DELETE /me/tokens/{id},只能在网页上用Bot换成Token(kind为bot或member),c.var.bot改叫c.var.token;Actor加上via怎么验证的
pnpm check通过:类型检查、lint、格式和 404 个测试pnpm e2e通过server/modules/auth/member-tokens.test.ts:令牌只返回一次;撤销后失效,只能撤销自己的;冻结的账号和站长不能生成;不能代表别人,不能调管理、bot 专用和网页上的接口;read的令牌不能发帖,L2 不能发,L3 发出的via为agent;每天第 6 个帖子返回429;封禁后和 90 天没用过的令牌失效影响
GET /me原来要read,现在profile就够,read包含它via多了agentapi_tokens的列改名、加索引,放宽三张表via的 CHECK,已有的 bot token 照常能用