鉴权设计
核心凭证
| 凭证 | 获取方式 | 存储位置 | 用途 |
|---|---|---|---|
appKey | 开发者自行定义为生成器 id | 前端代码中 | 标识当前生成器,用于数据隔离 |
uToken | 用户登录后获得 | 平台共享域 utoken Cookie | 标识用户身份 |
请求 Header
SDK 每个请求自动携带:
http
uToken: {用户的 uToken}
lang: {localStorage LANG_KEY 的值,默认 'en'}TIP
当前实现中 X-App-Key Header 已注释,appKey 通过请求体中的 category 字段传递来实现数据隔离。
Token 存储
- SDK 与社区项目对齐,统一读写平台共享域下的
utokenCookie appKey继续用于业务数据隔离,但不再作为 token 存储 key 的一部分- 初始化时如果发现旧版
__atomm_sdk_token__{appKey}仍存在,会在首次读取时自动迁移到utokenCookie - Cookie 不可用时(SSR / 隐私模式)静默忽略
Token 生命周期
登录 → setToken(appKey, token) → 写入 `utoken` Cookie
请求 → getToken(appKey) → 注入到 uToken Header
失效 → clearToken(appKey) → 清除 `utoken` Cookie → 触发 logout
退出 → clearToken(appKey) → passport-client.logout()
恢复 → getToken(appKey) → passportClient.userInfo() 验证 → 成功则恢复状态
Studio 内嵌 → 读取 Studio token / 监听 UserStateChanged → syncToken() → 与 Studio 主应用保持一致Studio 内嵌登录态
当生成器被 xTool Studio 内嵌时,SDK 会在 auth.ready() 的初始化流程中默认同步 Studio 登录态:
- 无界微前端场景读取
window.$wujie.props.token,并订阅window.$wujie.bus的UserStateChanged。 - iframe 场景读取
<iframe name="xTool-Studio-iframe" data-initial="...">中的初始 token,并监听 StudiopostMessage下发的UserStateChanged。Studio Electron 内的atomm://renderer属于可信来源。 - Studio token 优先级高于本地缓存;Studio 下发空 token 会清除 SDK 本地登录态。
生成器仍然通过 sdk.auth.getStatus()、sdk.auth.ready() 和 sdk.auth.onChange() 获取最终状态,无需关心当前是平台网页还是 Studio 内嵌环境。
安全性说明
| 风险点 | 防护措施 |
|---|---|
| appKey 被滥用 | appKey 本身只标识应用,不授权任何操作;用户未登录时所有 API 都失败 |
| 积分被恶意扣取 | credits.consume 后端校验 app_key 是否申请了该 action 权限 |
| 数据跨应用访问 | 后端以 category(appKey)+ uid 为复合维度隔离数据 |
| uToken 泄露 | 通过平台共享域 Cookie 管理,应用运行在平台域名下 |
| 恶意应用 | 代码上传后经安全扫描 + 人工审核,审核通过才能上线 |
| 跨域画布污染 | canvas.toDataURL() 捕获 SecurityError 并降级处理 |