ARC 在构建 session 视图之前,先从受信凭据解析调用者信息。结果 CallerInfo 可携带 DID、认证方式、角色,以及在服务端提供受信 instance 上下文时的 instance DID。
运行时知道什么
CallerInfo(AFS 核心类型)是解析后的交接形状:
| 字段 | 含义 |
|---|---|
did | 调用者 DID;匿名时为 null。把 null 当作匿名,不要当成哨兵字符串。 |
roles | 解析后的角色字符串(常见为单元素数组)。 |
pk | 可用时的公钥(hex)。 |
authMethod | 认证方式(例如 passkey、access-key、did-connect)。 |
instanceDid | 服务端在需要 membership 或展示上下文时盖章的 instance 标识。 |
displayName | 可选的 UI 显示名。 |
authSource | "cookie" 或 "bearer" — 凭据从哪条通道到达。 |
关心 CSRF 的变更型 AFS RPC 需要 authSource: "bearer"。仅有 cookie 不足以完成这些写入。
凭据输入
共享 caller 核心(services/shared,Node 与 Cloudflare 共用)接受:
| 输入 | 解析路径 |
|---|---|
Cookie: login_token=<JWT> | 浏览器 session JWT。 |
Authorization: Bearer <JWT> | 程序化 / 移动端 JWT(非 access key)。 |
Authorization: Bearer blocklet-… | Blocklet-service access key。 |
匿名请求(无 JWT 候选且无 Authorization)解析为 null。无效或无法解析的凭据也返回 null;核心不会对普通未认证流量抛错。
Membership 叠加
Instance membership 是叠在受信服务端上下文上的一层:
- 服务端解析请求的 tenant / instance DID。
- 当该值存在时,通用 caller 路径设置
membership: true,并把它喂给 connect-service 的resolveIdentity。 - Connect-service 可在用户全局角色之上返回该 instance 的角色(
owner/admin/member/guest)。 - 客户端不能靠在 UI 消息里点名 instance,或在会剥离/替换客户端 instance 头的路径上伪造头,来创造更强关系。
某些入口路径会在解析前移除或替换客户端提供的 instance 头。把它当作入口侧防护,而不是你后来发明的每个 ARC 入口的通用保证。
角色序位失败关闭
角色比较使用固定序位:
| 角色 | 级别 |
|---|---|
guest | 0 |
member | 1 |
admin | 2 |
owner | 3 |
无法识别或缺失的角色映射为级别 0(guest)。不要在应用代码里发明中间角色并假定运行时会承认。
把呈现与授权分开
用 session 事实决定页面是否显示某个操作。不要把该条件当成授权检查。provider 与运行时仍决定已解析调用者能否读、写、执行或遍历资源。
身份输入同样适用。文本字段、URL 参数、页面路由或 $session 替换都不能建立调用者身份。它们可以命名资源,但只有服务端凭据解析能判定「谁在问」。
面向 AUP 的同一边界说明:调用者身份与安全。
证据
| 主张 | 证据 |
|---|---|
共享凭据 → CallerInfo 映射 | services/shared/src/caller.ts(mapToCallerInfo、resolveCallerFromCredentials) |
| Node daemon 认证接线 | runtimes/node/src/daemon/auth/index.ts(setupAuthService、resolveCaller) |
| 角色失败关闭序位 | packages/aos/src/session/role-level.ts |
CallerInfo 字段合同 | packages/core/src/type.ts |
| 只读 memberships AFS 视图 | @aigne/afs-members(providers/basic/members/)— 仅 list/get;不是 membership 管理 API |
当前边界
本页记录调用者解析及其失败关闭的角色行为。它不记录账户创建、DID 恢复、membership 管理 UI,或完整的 instance 身份生命周期。不要从 session 里出现 DID 或角色,就推断那些流程已经存在。