身份与登录
AgentHub 使用 TokenDance ID 作为身份权威。AgentHub Home 公开站点的登录按钮应把用户带到 TokenDance ID,而不是自己实现一套本地密码登录卡片。
当前边界
线上官网登录只是低风险的 TokenDance ID 入口,用于站点个性化和未来的 Web handoff。它并不意味着 Hub API 授权、Edge target 访问、飞书/Lark action 或 runtime 执行权限已经通用可用。
登录流程
官网登录流程应保持简单:
- 用户在 AgentHub Home 点击 登录。
- AgentHub 创建带 PKCE 的浏览器端 OIDC authorization request。
- 浏览器跳转到 TokenDance ID。
- TokenDance ID 处理密码、第三方 provider、账号绑定和 session policy。
- TokenDance ID 跳回 AgentHub callback。
- AgentHub 只保存静态站点 UI 需要的低风险用户 profile 和过期时间。
- 用户回到发起登录的本地化页面。
AgentHub Home 不能把自己表现成第二个身份系统。如果登录页需要视觉状态,应是跳转到 TokenDance ID 的 redirect 或 transition 状态,而不是独立的凭据表单。
职责拆分
| 范围 | Owner | 公开规则 |
|---|---|---|
| 密码登录 | TokenDance ID | 不在 AgentHub Home 重新实现 |
| GitHub/Google/Feishu provider 登录 | TokenDance ID | AgentHub 只消费归一化 OIDC claim |
| 公开站点个性化 | AgentHub Home | 只做低风险 UI 状态 |
| 产品 session | Hub Server | 项目、团队、设备、路由和审计需要它 |
| 本地执行权限 | Edge Server + Desktop | workspace allowlist 和 approval policy 仍然生效 |
| 飞书/Lark 账号绑定 | TokenDance ID + AgentHub Integration Gateway | 飞书是协作入口,不是产品登录 |
| TokenDance API key | TokenDance Gateway | 模型 API 凭据,不是登录凭据 |
浏览器状态
AgentHub Home 是静态站点,所以浏览器状态必须收窄:
- 只保存 UI 个性化需要的用户显示信息和过期时间。
returnTo只允许同站点、本地化路径。- 不持久化 access token、ID token、refresh token、authorization code 或 provider response。
- 静态站点不请求
offline_access。 - logout 时先清理本地网站状态,再跳转 TokenDance ID logout。
如果未来 Web 工作台需要高信任产品访问,应使用 Hub 拥有的 session 和服务端校验,而不是把静态站点个性化状态当成授权。
授权边界
认证只回答"这个用户是谁"。AgentHub 授权仍要单独回答一组产品动作问题:
| 动作 | 需要哪个 owner 判断 |
|---|---|
| 打开项目 | Hub 产品授权 |
| 把任务路由到 Edge target | Hub 设备/项目授权 |
| 读取或下载 run artifact | Hub 权限与审计 |
| 启动本地执行 | Edge workspace policy |
| 写文件或执行 shell | Edge policy 加用户审批 |
| 执行飞书/Lark 卡片动作 | Integration Gateway 校验、TokenDance ID 绑定和 Hub 授权 |
成功登录官网不等于可以读取本地文件、启动 runtime、批准工具调用、管理 TokenDance Gateway key 或执行飞书/Lark action。
Callback 与返回路径
Callback 路由应该可审计、无意外:
- 只接受预期的 OIDC callback 参数。
- 校验跳转前创建的浏览器 nonce 或 state。
- 通过配置的 TokenDance ID issuer 交换 authorization code。
- 拒绝站外或格式异常的 return path。
- 返回
/en、/zh或有效的同站点本地化路径。 - OIDC state、issuer、client id 或 callback 配置错误时,展示清晰的失败状态。
公开文档可以描述 callback 形状和预期跳转行为;不能公开 client secret、admin key、原始 callback payload、refresh token 或私有错误响应。
UI 要求
登录入口应遵守产品站设计系统:
- 主登录按钮放在顶部导航右侧。
- 保留语言和主题控制,但不要让它们抢占登录按钮的层级。
- focus 和 active state 使用 TokenDance Blue。
- 不做独立的黑底登录页。
- 过渡状态要紧凑、清晰。
- 中英文文案保持同一套 i18n dictionary 结构。
同时测试 homepage mock 和登录状态时,主题和语言切换不能让 mock UI、导航文案或登录状态不同步。
故障分流
| 现象 | 第一动作 |
|---|---|
| 登录后回到错误语言 | 检查 returnTo 校验和本地化路由生成 |
| 登录看似成功但 UI 仍匿名 | 检查 sessionStorage 是否可用,以及 profile 是否过期 |
| 部署后 callback 失败 | 核对公开 callback URL、issuer、client id 和生成的静态 callback route |
| 飞书用户不能执行 AgentHub action | 检查 TokenDance ID 绑定,而不是官网登录状态 |
| 登录官网后 Hub API 仍拒绝 | 检查 Hub session 发行和产品授权,而不是静态站点 profile |
| Gateway key 页面要求 AgentHub 登录 | 修正产品边界文案;TokenDance API key 属于 Gateway |
文档规则
修改登录或身份行为时,同步更新这些入口:
- 本地化首页登录文案和导航顺序。
- 本页的身份与登录文档。
- 如果边界或故障路径变化,同步安全边界和排障指南。
llms.txt、sitemap、搜索索引、README 路由清单和更新日志。- 如果 callback、token storage、第三方 provider 归属或 relying-party 规则变化,同步 TokenDance root identity governance 文档。