代理登录
管理员或已认证 Agent 申请使用用户身份。代理 access token 使用独立签名,格式为 wnp-<JWT>,同时绑定操作者与目标用户,不是用户的普通 Supabase token。
| 方法 | 路径 | 认证与行为 |
|---|---|---|
| POST | /proxy-login | A 普通 JWT 且 site:impersonate,或现有 Agent binding;申请授权 |
| POST | /admin/impersonate | 兼容用户列表入口,普通管理员 JWT;同上 |
| GET | /proxy-login/current | 当前代理 token;返回服务端确认的代理身份 |
| GET | /proxy-login/:id | A/B 普通登录或当前对应代理;查看状态与身份 |
| POST | /proxy-login/:id/decision | 仅 B 本人的普通 JWT;批准或拒绝 |
| POST | /proxy-login/:id/claim | A 重新认证;领取已批准授权的一次性代理会话 |
| POST | /proxy-login/:id/revoke | A/B 普通登录、当前代理或有管理权限的普通管理员;撤销整会话 |
| POST | /admin/end-impersonation | 当前代理凭据;兼容释放入口,不信任 body 自报管理员 ID |
| GET | /proxy-login/:id/logs | A/B 或对应当前代理;分页查看该授权的可信审计 |
| GET/HEAD/POST/PATCH/DELETE | /proxy-login/data/rest/v1/* | 仅管理员代理,固定表/方法/RPC 清单;使用 B 的 RLS 权限 |
| GET/HEAD | /proxy-login/data/storage/v1/object/avatars/:userId/* | 仅管理员代理且 userId=B;首期不开放上传、签名或删除 |
申请 body:{ targetUserId, reason, scopes?, resources?, idempotencyKey? }。兼容入口接受 target_user_id。Agent 必须提供已发布 scope 与资源范围,不能请求免确认。服务端开发 override 默认关闭;客户端传 override 无效。
批准/拒绝 body:{ decision: 'approve' | 'reject' }。通知 action 为 { type: 'proxy_authorization', authorizationId },无 token 或任意跳转 URL。
成功结果使用 { success: true, data: { authorization, session?, actor, subject } }。pending 不包含凭据;active 的 session 包含 accessToken, tokenType, expiresIn, refreshToken, refreshExpiresIn, sessionId, proxyLogin。同一授权只发行一次;领取冲突需创建新的授权。
刷新复用 POST /auth/session/refresh 的 { refreshToken } 和 data.session 结构。后端根据已存储的 login_method 分流,不能接受客户端类型提示把代理换为普通 JWT。代理 access 默认 5 分钟,授权绝对期限 1 小时;刷新不能延长授权。
所有代理请求都有 X-Proxy-Request-Id。严格 attempt 审计不可用返回 503,业务不执行;已完成业务的 outcome 写入失败时保留真实响应,并附 X-Proxy-Audit-Status: outcome_pending。数据库提交审计失败直接回滚。凭据、Cookie、完整请求体不写审计。
数据转发的数据库前置校验依据实际事务状态:只读事务严格复验授权但不持行锁,可写事务持授权 SHARE 锁直至提交。客户端 method/header 不能改变此规则。撤销后的新请求拒绝;已经通过校验的在途读取可能完成,撤销不会追回已读取的数据。
审计历史的普通数据库读取角色仍按本人/站点管理员条件筛选;内部 workflow writer 仅能读取服务端代理文档 commit replay。角色范围修复不改变上述 API、RPC 签名或 token,也不扩展 writer 对账号/权限视图的访问。
代理能力使用明确清单:文档正文写入走协作 CAS,禁止裸写 content/yjs_state;通知标读/清理/批准、凭据签发、账号安全、任意关联查询、未适配的运行或外部票据均拒绝。Agent 不使用 raw 数据网关。