send 接入后台续期仍被线上客户端 offline_access 授权阻塞(#4 后续) #5

Closed
opened 2026-10-08 00:17:18 +00:00 by opencode-agent · 1 comment

结论

#4 已在提交 852db97d1a3d573689610532a08b7ea45c1eacc9 中完成代码层修复,但当前 send 生产客户端仍未获准请求 offline_access,无法取得 Refresh Token,阻塞 send 的后台续期接入。此 issue 是生产客户端配置/上线跟进,不是把已完成的 token-hook 实现认定为失效。

实际复现(2026-10-08)

使用 send 当前部署所用的 OIDC_CLIENT_ID(值未记录),读取线上 /.well-known/openid-configuration,向其 authorization_endpoint 发起标准授权请求:

response_type=code
redirect_uri=https://send.gjz010.com/api/auth/callback
scope=openid groups offline_access
prompt=consent

只读取第一跳,未登录账号、未同意授权、未交换或输出任何令牌。实际收到 HTTP 303,重定向到 send 的回调地址,并携带:

error=invalid_scope
error_description=The requested scope is invalid, unknown, or malformed. The OAuth 2.0 Client is not allowed to request scope 'offline_access'.

这证明现有生产客户端的允许 scope 尚不满足新的续期契约。公开 discovery 虽然列出了 refresh_token 和 offline_access,但它不能替代每个客户端的授权配置。

已核对的代码与上线边界

  • auth-web/src/apps.rs 已将 offline_access 加入受管 scope 白名单,且为显式 opt-in。
  • auth-web/src/oauth.rs 已允许在 consent 中授予此 scope。
  • auth-web/src/token_hook.rs 已在交换/刷新时读取当前身份、有效组和客户端策略;失败时拒绝签发旧权限快照。
  • hydra/hydra.yml 已配置 token hook、五分钟令牌期限和严格刷新轮换;docker-compose.yml 已接入 hook 鉴权配置。
  • docs/offline-access.md 明确要求客户端先登记 offline_access,再由用户显式同意。
  • 修复提交正文仍注明 Production deployment remains pending。当前线上是否已加载完整的新 auth-web、Hydra 配置及 hook 环境变量未由本次请求证明;请在处理本 issue 时确认。不要仅依据该提交说明断定线上一定未部署。

本次未运行 auth 的完整协议测试,也未修改 auth 的生产数据。

需要完成的工作

  1. 确认 #4 的 auth-web、Hydra 配置和 OAUTH2_TOKEN_HOOK_AUTH_CONFIG_VALUE 已完整部署,避免只更新前端/客户端 scope 而未启用实时权限 hook。
  2. 在应用管理中为现有 send 客户端显式增加 offline_access,保留 openid groups、原 client ID/secret、原回调地址及现有准入策略,不创建替代客户端。
  3. 明确已有授权需要一次带 prompt=consent 的重新同意才能获得 Refresh Token,旧的 send 本地 session 不会自动获得该能力。

验收标准

  • 以上相同授权请求不再返回 invalid_scope,可进入正常登录/同意流程。
  • 生产环境已加载 #4 的 token hook 与鉴权配置。
  • 通过明确授权的测试账号确认:首次 code exchange 能获得 Refresh Token,刷新能轮换令牌并返回新 ID Token/当前 groups;账号或准入被撤销后刷新失败。任何测试凭据/令牌不得贴入 issue。若真实账号测试需 RP 配合,请明确交接步骤。

完成客户端配置和上线确认后,send 才能继续实现并验收串行刷新、原子替换轮换令牌、ID Token 校验与五分钟权限更新。按用户指示,send 的接入目标暂时阻塞,不部署半可用续期方案。

## 结论 #4 已在提交 `852db97d1a3d573689610532a08b7ea45c1eacc9` 中完成代码层修复,但当前 send 生产客户端仍未获准请求 `offline_access`,无法取得 Refresh Token,阻塞 send 的后台续期接入。此 issue 是生产客户端配置/上线跟进,不是把已完成的 token-hook 实现认定为失效。 ## 实际复现(2026-10-08) 使用 send 当前部署所用的 OIDC_CLIENT_ID(值未记录),读取线上 `/.well-known/openid-configuration`,向其 authorization_endpoint 发起标准授权请求: ```text response_type=code redirect_uri=https://send.gjz010.com/api/auth/callback scope=openid groups offline_access prompt=consent ``` 只读取第一跳,未登录账号、未同意授权、未交换或输出任何令牌。实际收到 HTTP 303,重定向到 send 的回调地址,并携带: ```text error=invalid_scope error_description=The requested scope is invalid, unknown, or malformed. The OAuth 2.0 Client is not allowed to request scope 'offline_access'. ``` 这证明现有生产客户端的允许 scope 尚不满足新的续期契约。公开 discovery 虽然列出了 `refresh_token` 和 `offline_access`,但它不能替代每个客户端的授权配置。 ## 已核对的代码与上线边界 - `auth-web/src/apps.rs` 已将 `offline_access` 加入受管 scope 白名单,且为显式 opt-in。 - `auth-web/src/oauth.rs` 已允许在 consent 中授予此 scope。 - `auth-web/src/token_hook.rs` 已在交换/刷新时读取当前身份、有效组和客户端策略;失败时拒绝签发旧权限快照。 - `hydra/hydra.yml` 已配置 token hook、五分钟令牌期限和严格刷新轮换;`docker-compose.yml` 已接入 hook 鉴权配置。 - `docs/offline-access.md` 明确要求客户端先登记 `offline_access`,再由用户显式同意。 - 修复提交正文仍注明 `Production deployment remains pending`。当前线上是否已加载完整的新 auth-web、Hydra 配置及 hook 环境变量未由本次请求证明;请在处理本 issue 时确认。不要仅依据该提交说明断定线上一定未部署。 本次未运行 auth 的完整协议测试,也未修改 auth 的生产数据。 ## 需要完成的工作 1. 确认 #4 的 auth-web、Hydra 配置和 `OAUTH2_TOKEN_HOOK_AUTH_CONFIG_VALUE` 已完整部署,避免只更新前端/客户端 scope 而未启用实时权限 hook。 2. 在应用管理中为现有 send 客户端显式增加 `offline_access`,保留 `openid groups`、原 client ID/secret、原回调地址及现有准入策略,不创建替代客户端。 3. 明确已有授权需要一次带 `prompt=consent` 的重新同意才能获得 Refresh Token,旧的 send 本地 session 不会自动获得该能力。 ## 验收标准 - 以上相同授权请求不再返回 `invalid_scope`,可进入正常登录/同意流程。 - 生产环境已加载 #4 的 token hook 与鉴权配置。 - 通过明确授权的测试账号确认:首次 code exchange 能获得 Refresh Token,刷新能轮换令牌并返回新 ID Token/当前 groups;账号或准入被撤销后刷新失败。任何测试凭据/令牌不得贴入 issue。若真实账号测试需 RP 配合,请明确交接步骤。 完成客户端配置和上线确认后,send 才能继续实现并验收串行刷新、原子替换轮换令牌、ID Token 校验与五分钟权限更新。按用户指示,send 的接入目标暂时阻塞,不部署半可用续期方案。
Author
Owner

关闭原因:本问题是 send 客户端的接入配置,不是 auth 上游代码缺陷。维护者已为现有客户端启用 offline_access;此前应直接协调客户端 scope 配置,不应作为新的上游问题提交。auth #4 的代码修复不受此影响。本评论记录维护者确认,不代表已完成生产刷新全流程验收。

关闭原因:本问题是 send 客户端的接入配置,不是 auth 上游代码缺陷。维护者已为现有客户端启用 offline_access;此前应直接协调客户端 scope 配置,不应作为新的上游问题提交。auth #4 的代码修复不受此影响。本评论记录维护者确认,不代表已完成生产刷新全流程验收。
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gjz010.dev/auth#5
No description provided.