v0.1首个版本化设计基线查看版本范围
Developer

identity

identity 让 guest 知道“用户是否已在本应用中完成平台登录”,并触发由可信壳层完成的登录或退出流程。v0.1 不向 guest 暴露全局用户对象、email、显示名、token 或可跨应用关联的 ID。

基本示例

const { authenticated } = await host.identity.status();

if (!authenticated) {
  showSignInButton(async () => {
    await host.identity.login();
    renderSignedInState();
  });
}

login() 完成表示平台流程结束;应用应重新调用 status(),而不是从回跳 URL 或隐藏载荷推断身份。

适用场景

  • 决定是否显示需要账户同步的功能。
  • 由用户主动进入平台登录界面。
  • 在可信确认后退出当前定义的应用会话范围。

需要稳定的每应用主体标识、显示名或头像时,必须由后续版本另行授权;不得恢复旧 identity.current()

能力声明

{
  "capabilities": [
    "host:identity.status",
    "host:identity.login",
    "host:identity.logout"
  ]
}

Reference

{ ok: true } 确认不算信息回程;方法不得把 token、checkout URL、全局 ID 或用户资料夹带在返回值中。

登录流程

  1. guest 在用户点击后调用 login()
  2. 宿主显示带应用身份的可信登录 UI。
  3. 平台完成 Passkey 或其他账户流程。
  4. 壳层用不可由 guest 构造的 nonce 或固定回跳位置恢复应用。
  5. guest 重新调用 status()

guest 不传 returnTo、URL、provider token 或任意字符串载荷。

退出示例

async function signOut() {
  // 宿主仍会显示可信确认,并明确影响范围。
  await host.identity.logout();
  const state = await host.identity.status();
  if (state.authenticated) throw new Error('sign-out did not complete');
}

一次应用调用不能无确认地销毁所有应用、所有设备或平台账户的全局会话。

原生 WASM 示例

IdentityStatus state = host_identity_status();
if (!state.authenticated && user_pressed_login()) {
  host_identity_login();
  state = host_identity_status();
}

原生 guest 在加载完成后通过普通调用触发流程;宿主不能依赖 guest 在加载前注册特殊回跳处理器。

平台托管条件

三种方法要保持 green,必须逐方法满足:目的地固定、输入形状封闭、容量与速率有预算、guest 无额外响应通道、操作有披露与审计。登录/退出还必须有真实的用户激活闸门和可信 UI。

任何实现若把完整 location.href、全局用户信息或自由 guest 字符串带入平台流程,都会失去该例外,必须重新定档。

隐私与安全

  • status 返回 app-context 的布尔状态。
  • 登录授权不会把外部身份资料的来源改成 app-context;v0.1 因此根本不返回这些资料。
  • 不回落 email 作为显示名。
  • 不把全局 ID 做普通哈希充当假名;无密钥派生仍可直接比较或枚举关联。
  • 登录 nonce 单次使用、短期有效并绑定 appId 与流程实例。
  • 审计只记录流程和结果,不向 guest 返回账户标识。

错误与测试

用户关闭登录或退出确认返回正常取消结果;策略错误使用 activation-requireddeniedflow-expiredplatform-unavailable。一致性测试至少覆盖伪造回跳、重复 nonce、跨应用 nonce、无手势调用、用户取消、全局退出误伤、email 泄露和返回载荷检查。

Host API 版本与分层概览Host API v0.1版本非正式提议提议canvas API呈现canvas.getInfo()方法canvas.draw()方法canvas.present()方法canvas.measureText()方法canvas.frame event事件canvas.resize event事件asset API呈现asset.read()方法asset.loadFont()方法playback API呈现playback.open()方法playback.write()方法playback.stop()方法playback.ready event事件playback.ended event事件input API输入input.focus()方法input.pointer event事件input.key event事件input.wheel event事件ime API输入ime.openSession()方法ime.updateState()方法ime.updateGeometry()方法ime.closeSession()方法ime.textUpdate event事件ime.composition event事件ime.formatUpdate event事件ime.characterBoundsRequest event事件capture API输入capture.requestCamera()方法capture.requestMic()方法capture.frame()方法capture.readAudio()方法capture.stop()方法capture.ended event事件store API数据store.get()方法store.put()方法store.delete()方法store.list()方法store.deletePrefix()方法clipboard API数据clipboard.readText()方法clipboard.writeText()方法clipboard.readImage()方法clipboard.writeImage()方法net API网络net.fetch()方法identity API身份identity.status()方法identity.login()方法identity.logout()方法env API平台集成env.snapshot()方法env.change event事件print API平台集成print.open()方法开始调用 Host API指南构建交互式绘图应用指南构建自绘文本编辑器指南管理媒体采集与播放指南组织本地数据与同步指南