Skip to main content
Documentation navigation

KAI AUTH / DEVELOPERS

Better Auth 1.7.1Updated Content: Simplified Chinese
View Markdown
On this page

退出与授权撤销

明确区分退出当前应用、结束 Auth 会话和撤销应用授权,避免把本地清理误认为全局退出。

退出应用

清理应用自己保存的会话和令牌即可退出当前应用;这不会自动清除 Auth 的登录 Cookie,用户下次授权仍可能直接登录。

如果还要让已保存的 refresh token 失效,应用必须调用撤销端点;仅删除本机副本不等于服务端撤销。kai-auth logout 结束的是当前 CLI profile 的 KAI 开发者会话,并删除本地会话记录,不是替任意第三方 OAuth 应用撤销授权。

浏览器退出与离线授权

用户批准了 offline_access 后,普通 Auth 网页退出、切换账号和来源浏览器会话过期,不会撤销该应用的离线授权。Authorization Code 和 Device Code 使用同一规则;应用可以继续刷新令牌,直到授权被撤销、刷新令牌到期或安全策略不再允许访问。没有 offline_access 的授权仍受来源会话生命周期约束。

Auth 保留授权时的认证证据和当前安全检查,不会把刷新当作一次新登录。用户修改密码、安全因子或二步策略,账号被冻结,组织准入不再满足,或者明确撤销应用授权时,已有离线授权仍会失效。应用遇到 invalid_grant 应重新发起交互授权,不要无限重试。

组织修改某位成员的角色、移除成员、成员主动退出,或调整其数据分析访问权限时,只撤销该成员在该组织下的应用授权;其他用户的离线授权可以继续刷新,该成员在其他组织的授权也不受影响。恢复原角色、重新加入组织或解冻账号不会恢复已撤销的授权,必须重新授权。组织整体停用或删除仍会撤销整个组织下的应用授权。

长期运行的设备客户端应持久化每次轮换后的 refresh token,并区分授权失效与暂时性请求失败。收到 invalid_grant 后保留 code、requestId 和发生时间,停止重复使用同一失效凭据并通知负责人重新授权;不要把进程仍在运行等同于授权仍有效。重新授权后应至少确认一次正常自动续期,不能只检查刚领取的 access token。

RP-Initiated Logout

使用 OIDC Discovery 的 end_session_endpoint(当前 /api/auth/oauth2/end-session)。通常发送已验证的 ID token 作为 id_token_hint,需要返回应用时发送已登记的 post_logout_redirect_uri 和随机 state。

GET /api/auth/oauth2/end-session
  ?id_token_hint=ID_TOKEN
  &post_logout_redirect_uri=https%3A%2F%2Fapp.example.com%2Fsigned-out
  &state=LOGOUT_STATE

退出后的地址必须在该客户端的退出回调白名单中。缺少可用 hint,或 hint 与当前浏览器会话不匹配时,Auth 会要求用户确认;应用应允许正常顶层页面导航,不把确认页面当成协议故障。返回应用后核对 logout state。

Back-channel Logout

需要跨应用结束本地会话时,登记自己的 HTTPS back-channel logout URI。该地址必须为公网可路由主机,不能含 URL 凭据或 fragment。接收方验证 logout token 的签名、issuer、audience、事件声明和重放条件,并按 sid 或 sub 清理自己的对应会话。

后端通知不能直接清理另一个站点的浏览器 Cookie。接入方必须真正实现自己的会话失效逻辑,登记 URL 本身不代表完成单点退出。

撤销令牌与授权

使用 Discovery 的 revocation_endpoint(当前 /api/auth/oauth2/revoke)处理应用持有的可撤销令牌,并使用该客户端登记的认证方式。用户也可在个人账号的已授权应用中撤销 consent。

自包含 JWT access token 不能像数据库里的 opaque token 一样逐条删除后立即使所有离线验证失效。当前实现对仍有效的 JWT 单令牌撤销返回 HTTP 400 unsupported_token_type,不能把该结果或浏览器清理视为服务端已撤销。刷新链、会话和授权状态的失效,不保证已发行 JWT 立即被离线资源服务器拒绝。根据敏感程度选择在线检查,并保持较短有效期。

撤销整个 consent 与上述单 JWT 撤销请求不同:consent 删除后,其 JWT 会立即被 Auth 的在线 UserInfo 和 Introspection 拒绝;缩减权限或之后重新授权也不能让旧 JWT 恢复有效。普通结束来源 Auth 会话会终止依赖该会话的授权,但不替代对已批准离线授权的撤销。离线资源服务器仍需遵守前述有效期边界。

普通 prompt=login 或 max_age 触发的重新验证会在完整验证后更新原会话证据,保留 SID 和其他应用授权,不等同于退出。修改密码、因子或二步策略则会撤销旧令牌链,即使当前浏览器会话经校验得以保留;详细规则见令牌校验与 claims。

测试退出时分别检查:当前应用会话是否消失、Auth 是否需要重新登录、其他接入应用是否处理通知、旧 refresh token 是否仍可使用。单个退出回跳成功只证明其中一个步骤。