@@ -33,33 +33,15 @@ wrangler r2 bucket create nsuk-uploads
3333| 追加重定向 URI | ` http://127.0.0.1:3000/api/auth/callback ` (本地开发) |
3434| allowed_scopes | ` openid ` ` profile ` ` email ` ` offline_access ` |
3535
36- ### ⚠️ 建完必须再补一步:勾上 ` teams:read `
36+ ` teams:read ` 在创建时直接勾上即可。
3737
38- ** 创建时勾 ` teams:read ` 是无效的。** 团队应用创建端点
39- (` POST /api/teams/:id/apps ` )对 scope 做了硬编码过滤:
38+ > 若 Prism 实例早于 ` 4fcf53b ` ,团队应用创建端点会把 ` teams:read ` 静默丢弃
39+ > (界面上勾了、保存成功、无报错,但没写进去)。这种情况需要建完后进应用详情页
40+ > 再勾一次保存 —— 更新走 ` PATCH /api/apps/:id ` ,不受该限制。
4041
41- ``` js
42- .filter ((s ) => [" openid" ," profile" ," email" ," apps:read" ," offline_access" ].includes (s))
43- ```
44-
45- ` teams:read ` 不在里面,会被** 静默丢弃** —— 界面上勾了、保存成功、没有任何报错,
46- 但它就是没写进去。
47-
48- 正确做法是** 创建完再改一次** :进应用详情页 → Scopes → 勾上 ` teams:read ` → 保存。
49- 更新走的是 ` PATCH /api/apps/:id ` ,那里用的是宽松的 ` isAllowedScope ` ,允许该 scope。
50- 改动需要** 团队 admin 及以上** 权限。
51-
52- 也可以用 API:
53-
54- ``` bash
55- curl -X PATCH https://< prism> /api/apps/< appId> \
56- -H " Authorization: Bearer <token>" -H " Content-Type: application/json" \
57- -d ' {"allowed_scopes":["openid","profile","email","offline_access","teams:read"]}'
58- ```
59-
60- ** 没配上的表现** :所有人都能登录,但一律是游客,赞助者拿不到模组令牌,
61- 且没有任何报错。官网对此有专门的诊断日志 ——
62- 如果 Worker 日志里出现 ` ID token 里没有任何 in_team_* claim ` ,就是这个问题。
42+ ** 漏配的表现** :所有人都能登录,但一律是游客,赞助者拿不到模组令牌,且没有任何
43+ 报错。官网对此有专门的诊断 —— Worker 日志出现
44+ ` ID token 里没有任何 in_team_* claim ` 就是这个问题。
6345
6446** 关于过度授权** :` teams:read ` 会带上用户全部团队的 membership claim。在 Prism 的
6547P1(应用预绑定团队的窄 scope)落地前没有更窄的选择 —— 单团队 scope 要求授权者是
@@ -184,6 +166,53 @@ wrangler secret put MOD_LICENSE_PRIVATE_KEY
184166wrangler secret put WEBHOOK_SECRET
185167```
186168
169+ ## 四点五、先在本地跑通(强烈建议)
170+
171+ 登录链路涉及 Prism、回调地址、scope、身份组映射四处配合,任何一处错了线上都
172+ 只表现为「登录后是游客」。在本地把它跑通,比部署完再回头查便宜得多。
173+
174+ 前提:第 1.2 步的重定向 URI 里已经加了 ` http://127.0.0.1:3000/api/auth/callback ` 。
175+
176+ ``` bash
177+ cp .dev.vars.example .dev.vars
178+ ```
179+
180+ ` .dev.vars ` 里填上真实值(这个文件已在 ` .gitignore ` 中):
181+
182+ ```
183+ PRISM_CLIENT_SECRET="…"
184+ MOD_LICENSE_PRIVATE_KEY="…"
185+ WEBHOOK_SECRET="…"
186+ PRISM_ISSUER="https://<prism 域名>"
187+ PRISM_CLIENT_ID="…"
188+ PRISM_TEAM_ID="…"
189+ SITE_URL="http://localhost:3000"
190+ ```
191+
192+ ` SITE_URL ` 必须是 ` http://localhost:3000 ` —— 它同时决定回调地址的拼法和
193+ cookie 的 ` Secure ` 标志,填成 https 的话本地浏览器不会存 cookie,登录会静默失败。
194+
195+ ``` bash
196+ pnpm db:migrate:local
197+ pnpm dev
198+ ```
199+
200+ 浏览器打开 < http://localhost:3000/account > → 用 Prism 登录,逐项确认:
201+
202+ - [ ] 能跳到 Prism 授权页并跳回来
203+ - [ ] 账号中心显示的身份组与 Prism 里给你打的组一致
204+ - [ ] 终端日志** 没有** ` 没有任何 in_team_* claim `
205+ - [ ] 给自己打上 ` sponsor ` 组 → 重新登录 → 模组授权区出现,能生成令牌
206+ - [ ] 拿生成的令牌调一次 validate,应返回 License:
207+
208+ ``` bash
209+ curl -X POST http://localhost:3000/api/mod/validate \
210+ -H " Content-Type: application/json" \
211+ -d ' {"token":"<刚生成的令牌>","fingerprint":"local-test"}'
212+ ```
213+
214+ webhook 本地收不到(Prism 打不到 localhost),留到线上验。
215+
187216## 五、建表与部署
188217
189218``` bash
0 commit comments