支持应用后台续期,并在刷新时重新校验账号状态与最新组权限 #4

Closed
opened 2026-10-07 18:00:21 +00:00 by opencode-agent · 0 comments

背景与影响

send 需要保持较长的本地登录会话,同时将组权限变更的生效延迟控制在约 5 分钟。目前 send 只能重新走浏览器授权来取得新组声明,造成频繁跳转,并可能打断长时间上传。send 自身将本地会话寿命绑定到 ID token exp 的问题会在 send 修复;本 issue 仅追踪 auth 缺失的后台续期与权限更新能力。

核查证据

只读检查 auth main 提交 4e49a11d93e3a461d42d192ec5072d2deba9b13e,并请求线上公开 discovery(HTTP 200)。未修改 auth 配置,未执行真实用户 refresh grant,也未运行 auth 测试套件;以下测试引用为源码证据。

  1. Hydra 平台宣告支持,但受管客户端无法正常取得 Refresh Token。 线上 /.well-known/openid-configuration 包含 refresh_token grant、offline_access scope、撤销端点及 back-channel logout 支持。然而 auth-web/src/apps.rs:34,307-323 的受管 scope 白名单仅允许 openid profile email groups;auth-web/tests/http.rs:1925 明确将 offline_access 注册请求列为 400。auth-web/src/oauth.rs:311-321 的 consent 白名单也会过滤 offline_access。客户端虽配置 grant_types: [authorization_code, refresh_token](apps.rs:392),仍没有完整的离线授权签发路径。
  2. 没有刷新时重算组声明的接线。 auth-web/src/oauth.rs:347-364 在 consent 时读取 effective groups,然后写入 Hydra 的 session.id_token 与 session.access_token。edge/Caddyfile:54-62 将 /oauth2/* 和 /userinfo 直接转发 Hydra;当前 hydra/hydra.yml、compose 与 auth-web 路由未配置 token refresh hook 或其他实时权限更新路径。因此仅放开 offline_access 还不足以保证刷新后的 groups 是最新值。
  3. 账号禁用/中央会话撤销与 OAuth 授权撤销的边界尚未打通。 auth-web/src/ory.rs:214-243 与 http.rs:426-430 的撤销调用针对 Kratos。需要明确旧 Hydra 授权何时失效,至少保证禁用账号或撤销应用资格后不能继续后台续期。

线上 discovery 反映 Hydra 支持的能力,并不能单独证明当前客户端政策已允许使用;本 issue 的缺口依据为上述 auth 仓库实现。

期望行为与验收

  • 为获准的 confidential clients 提供完整的 offline_access 注册、同意与 Refresh Token 签发流程,并文档化所需配置。
  • 正常刷新无需浏览器跳转;明确令牌有效期、轮换、旧令牌重用和撤销语义,使用 Hydra 现有能力。
  • 刷新时基于当前身份、当前 effective groups 和当前客户端访问政策重新授权;用户组变动应体现在新的权限声明中,失去应用资格或账号被禁用时应拒绝续期,不能无限延续 consent 时的旧快照。
  • 给 RP 一个明确可消费的最新组信息来源:新 ID Token、Access Token 或受保护查询接口。请明确返回形状、scope、groups 字符串数组语义,以及刷新响应是否保证包含新 ID Token;send 不应凭假设接入。
  • 为上述行为补充系统测试:首次取得 refresh token、正常轮换、过期/撤销/重用失败、组变化更新、移出准入组和禁用账号后刷新失败。
  • 说明中央登出与 RP 本地会话的区别,以及撤权最大延迟。Back-channel logout 可作为后续增强,不要求先完成它才能交付安全的刷新路径。

实现建议与范围

优先核实当前固定 Hydra 版本支持的 token hook/刷新扩展机制,复用 auth-web 已有的身份与组计算逻辑。具体 hook 配置和内部鉴权由 auth 维护者设计,不应仅因为 discovery 已列出 refresh_token 就视为完成。不要通过延长令牌寿命或永久缓存旧 groups 来替代权限更新。

能力交付并部署后,send 将按明确契约接入后台刷新;在此之前保留现有的权限新鲜度检查,不伪装成已实现无感续期。

## 背景与影响 send 需要保持较长的本地登录会话,同时将组权限变更的生效延迟控制在约 5 分钟。目前 send 只能重新走浏览器授权来取得新组声明,造成频繁跳转,并可能打断长时间上传。send 自身将本地会话寿命绑定到 ID token exp 的问题会在 send 修复;本 issue 仅追踪 auth 缺失的后台续期与权限更新能力。 ## 核查证据 只读检查 auth `main` 提交 `4e49a11d93e3a461d42d192ec5072d2deba9b13e`,并请求线上公开 discovery(HTTP 200)。未修改 auth 配置,未执行真实用户 refresh grant,也未运行 auth 测试套件;以下测试引用为源码证据。 1. **Hydra 平台宣告支持,但受管客户端无法正常取得 Refresh Token。** 线上 `/.well-known/openid-configuration` 包含 `refresh_token` grant、`offline_access` scope、撤销端点及 back-channel logout 支持。然而 `auth-web/src/apps.rs:34,307-323` 的受管 scope 白名单仅允许 `openid profile email groups`;`auth-web/tests/http.rs:1925` 明确将 `offline_access` 注册请求列为 400。`auth-web/src/oauth.rs:311-321` 的 consent 白名单也会过滤 `offline_access`。客户端虽配置 `grant_types: [authorization_code, refresh_token]`(`apps.rs:392`),仍没有完整的离线授权签发路径。 2. **没有刷新时重算组声明的接线。** `auth-web/src/oauth.rs:347-364` 在 consent 时读取 effective groups,然后写入 Hydra 的 `session.id_token` 与 `session.access_token`。`edge/Caddyfile:54-62` 将 `/oauth2/*` 和 `/userinfo` 直接转发 Hydra;当前 `hydra/hydra.yml`、compose 与 auth-web 路由未配置 token refresh hook 或其他实时权限更新路径。因此仅放开 offline_access 还不足以保证刷新后的 groups 是最新值。 3. **账号禁用/中央会话撤销与 OAuth 授权撤销的边界尚未打通。** `auth-web/src/ory.rs:214-243` 与 `http.rs:426-430` 的撤销调用针对 Kratos。需要明确旧 Hydra 授权何时失效,至少保证禁用账号或撤销应用资格后不能继续后台续期。 线上 discovery 反映 Hydra 支持的能力,并不能单独证明当前客户端政策已允许使用;本 issue 的缺口依据为上述 auth 仓库实现。 ## 期望行为与验收 - 为获准的 confidential clients 提供完整的 `offline_access` 注册、同意与 Refresh Token 签发流程,并文档化所需配置。 - 正常刷新无需浏览器跳转;明确令牌有效期、轮换、旧令牌重用和撤销语义,使用 Hydra 现有能力。 - 刷新时基于当前身份、当前 effective groups 和当前客户端访问政策重新授权;用户组变动应体现在新的权限声明中,失去应用资格或账号被禁用时应拒绝续期,不能无限延续 consent 时的旧快照。 - 给 RP 一个明确可消费的最新组信息来源:新 ID Token、Access Token 或受保护查询接口。请明确返回形状、scope、`groups` 字符串数组语义,以及刷新响应是否保证包含新 ID Token;send 不应凭假设接入。 - 为上述行为补充系统测试:首次取得 refresh token、正常轮换、过期/撤销/重用失败、组变化更新、移出准入组和禁用账号后刷新失败。 - 说明中央登出与 RP 本地会话的区别,以及撤权最大延迟。Back-channel logout 可作为后续增强,不要求先完成它才能交付安全的刷新路径。 ## 实现建议与范围 优先核实当前固定 Hydra 版本支持的 token hook/刷新扩展机制,复用 auth-web 已有的身份与组计算逻辑。具体 hook 配置和内部鉴权由 auth 维护者设计,不应仅因为 discovery 已列出 refresh_token 就视为完成。不要通过延长令牌寿命或永久缓存旧 groups 来替代权限更新。 能力交付并部署后,send 将按明确契约接入后台刷新;在此之前保留现有的权限新鲜度检查,不伪装成已实现无感续期。
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#4
No description provided.