运行限定范围的身份验证测试
本次源码增加自定义 Atlas 测试会话代理。只有单独批准并配置 TEST_SESSION_POLICY 后才可启用。真实 GitHub Actions 工作负载使用 OIDC;其他交互客户端需由已登录的人明确批准自定义会话授权。本功能不是 OAuth 授权服务器,也不是 RFC 8628 实现;不声称 dot 浏览器具备工作负载身份。
确定测试范围
人员登录、测试运行器和发布操作员使用独立身份。测试身份不能取得 owner、平台超级管理员、发布、委托令牌或内部人员授权。不得提升 [email protected] 的权限或迁移凭据文件。服务端按不可变组织 ID 限定范围:预发布仅允许 for-dev、uat-org;生产仅允许 uat-org。显示名称不构成权限。目标必须已有有效成员记录,且 role_override 与配置角色一致;owner 和平台管理员名单中的身份不能作为测试目标。权限同时受默认角色和当前组织授权限制。
启用交接(尚未执行)
- 现有发布协调员审查精确 PR 和独立验证结果。先发布所有使用共享会话验证器的服务:Auth、CRM、Agent、Tasks、EKB、Governance,以及仍在使用的 Knowledge;旧服务不能验证新授权。
- 针对精确共享会话数据库,另行批准并执行新增 Auth 迁移
0024_test_session_grants.sql。保留审计和重放防护记录,不重放历史种子迁移。 - 逐项批准真实测试成员及其明确角色。本源码不创建真实账户、成员、密钥、令牌或授权。
- 通过注册的 Auth 配置发布流程,逐项批准每个环境的完整
TEST_SESSION_POLICY。记录发行方、受众、subject、不可变仓库/所有者 ID、工作流、分支、环境、人员批准者和目标。禁止通配信任;GitHub subject 格式可能不同,不能假定旧格式。 - 仅真实受支持的运行器可请求 OIDC 断言。相应工作流须有必要权限及环境保护;此处不配置工作流或信任关系。生产启用需要独立的精确批准。
配置字段
策略存在时,现有 Auth 权限清单将精确 TEST_SESSION_POLICY 字节纳入摘要;签发要求注册状态一致且就绪,等待中、缺失或不一致时拒绝。策略不存在时保留原四字段描述。
发行方和 JWKS 固定为 https://token.actions.githubusercontent.com 与 /.well-known/jwks;算法为 RS256。策略字段:audience、subject、repositoryId、repositoryOwnerId、workflowRef、ref、workloadEnvironment、humanApprovers、targets。目标包含批准的 key、email、orgId、role(rep、manager、admin)。工作流须位于 Forth-AI/atlas-agentics 的批准分支,工作负载环境必须等于服务运行环境。配置、主存储或限流器缺失、无效或不可用时拒绝授权。
建立浏览器会话
在可信运行器进程内使用 tools/test-session/browser-session.ts,由真正支持工作负载身份的运行环境提供 getWorkloadAssertion(audience)。browserRequest 使用 Playwright BrowserContext.request,与浏览器共享 Cookie 存储。适配器不返回凭据。不得将网络跟踪、storageState、敏感截图传给模型,也不得提交身份状态文件。
| 请求 | 授权和请求体 |
|---|---|
POST /auth/test-sessions/workload | 请求头携带 OIDC Bearer 断言,不带 Cookie 或 Origin;JSON {challenge} 为随机 32 字节 verifier 的 SHA-256 base64url。验证签名、单一受众、subject、不可变仓库/所有者 ID、工作流、分支、环境、iat/nbf/exp 和持久化唯一 jti。断言最多已签发 5 分钟,生命周期最多 10 分钟。 |
POST /auth/test-sessions/approve | 已登录人员、同源 Origin、JSON {approve:true,challenge}。仅明确配置的批准者,且须为全部目标所在测试组织的当前 admin/owner;拒绝平台或测试会话。此为自定义人员批准,不会自动授权或冒充 CI。 |
POST /auth/test-sessions/exchange | 同源 Origin,JSON {grant_id,exchange_code,verifier,target}。创建授权后通过 HTTPS 将前两个敏感字段交给可信进程;兑换需匹配证明,60 秒失效,并发也仅一次成功。写入 HttpOnly、SameSite=Lax、Secure atlas_session,仅返回 {ok:true}。 |
GET /auth/me | 返回当前测试身份、环境、原始 actor 和允许的目标。测试会话不得进入普通组织切换、账户凭据库、委托或平台操作。 |
POST /auth/test-sessions/switch | 同源测试会话;{target} 只能选择存储的目标 key。原子停用旧 sid,创建新 sid,不延长授权。 |
POST /auth/test-sessions/revoke | 同源测试会话及 {} 撤销整份授权和关联会话。POST /auth/logout 或 POST /auth/accounts/logout 仅撤销当前测试会话。 |
写入必须使用 HTTPS、JSON,拒绝 URL 查询参数,并按客户端共享每分钟 10 次的限流;请求体最多 24 KB。凭据不进入 URL 或日志。授权最长 15 分钟,无刷新,切换不续期。所有服务实时检查授权、会话身份、成员、角色、权限上限、组织停用及运行环境;不得通过请求参数访问业务组织。通过 atlas_test_sessions 将操作 sid 关联到授权 actor,区分运行器/批准人员与实际测试账户。
拒绝与当前限制
401:无效断言或会话;403:范围、证明、CSRF、成员验证失败;409:重放或会话已变;429:限流器缺失、不可用或超限;503:未启用或存储不可用。不记录异常详情或凭据。兑换消耗后若写入失败,需重新申请,不允许重放恢复。没有全局 login-as 接口。
直接 Cookie 路径及明确映射到 CRM、Tasks、EKB 的短期操作断言均实时验证授权。接收方须明确提供主会话数据库和运行环境;其他接收方一律拒绝。断言签名后若授权被撤销,执行时仍会拒绝。持久化委托、策略证明、团队人员及集成授权仍拒绝测试身份;这些属于人员或长期授权,不能据此提升测试权限,相关验收需另行限定范围的适配器。
验收与回退
离线测试仅使用合成 RSA 密钥、模拟 JWKS、本地 SQLite/D1 和浏览器传输/会话测试。启用前逐项确认全部服务精确 SHA、所有 API 的业务租户拒绝、发行方/受众/仓库/工作流/环境错误、密钥轮换、过期、重放与并发兑换/切换、缺少 verifier 的盗码、CSRF、撤销/停用/降权、存储/限流器故障、actor 追溯、桌面与 390px 中英测试标签、未发送内容提示、跨标签页请求、浏览器返回、当前/全部测试会话退出及夹具清理。未开通付费服务或真实授权。
回退先撤销活跃授权(当前测试会话撤销操作,或另行批准的精确数据库操作),再通过注册发布配置移除策略以停止新授权。仅移除策略不会撤销现有授权。保留新增表及重放/审计记录。原固定验证码机制不变;替代方案验收通过后,另行批准退役。UAT 清理由协调中的负责人处理,此源码不删除线上数据。
协议参考
GitHub OIDC · Playwright 身份验证 · OAuth 设备授权标准。Atlas 自定义批准接口不声称符合该标准。