理解 Downcity City

token 模型

管理员会话与 user_token 如何配合。

Downcity 使用管理员会话 Token 管理 Federation,并使用 user_token 让终端 client 调用 service。

可信后端你的后端使用管理员 ID 和密码登录,然后持有有时限的管理员会话 Token。创建 city / 申请 user_token
Downcity校验管理员会话 Token,签发 user_token,并在内部保存 provider key。
终端 client前端、扩展或 App 使用 user_token 创建 User City 并调用 service。拿不到管理员凭证

user_token

user_token 是给终端用户或产品 client 使用的调用凭证。它由 FederationAdmin 基于 bureau_id + user_id 向 Federation 申请。

  • bureau_id
  • user_id
  • metadata
  • ttl

登录开始时由产品配置明确 bureau_id;登录完成后,client 调用 service 只携带 user_tokenbureau_id 由 Federation 从已验证 Token 中读取。client 不接触 provider key,也不接触管理���会话 Token。

User Token 使用单一 downcity:user audience。Federation 与 Bureau Server 校验同一个 audience; Bureau Server 还会比较 Token 中的 bureau_id 与自身绑定的 Bureau ID。bureau_id 始终保持 产品提供的原始值,不参与 audience 拼接或规范化。

管理员会话 Token

使用 fed deploy 配置的管理员 ID 和密码访问 /v1/admin/login。登录响应会返回有时限的管理员会话 Token;可信后端把它传给 FederationAdmin,用于创建 Bureau、管理 env,以及请求 Federation 为用户签发 user_token。密码只以 PBKDF2 摘要保存,不再生成或注入管理员 secret key 环境变量。

const admin = new FederationAdmin({
  base_url: "https://base.example.com",
  credential: administrator_session_token,
});

const bureau = await admin.bureaus.create({
  name: "Chrome Extension",
  server_url: "https://bureau.example.com",
});

多产品复用

多个 client 可以归属同一个 Bureau。签发 token 时明确写入 bureau_id

const user = await admin.service("accounts").action("tokens/issue").invoke({
  bureau_id: bureau.bureau_id,
  user_id: "user_123",
  metadata: {
    plan: "pro",
  },
  ttl: "7d",
});

console.log(user.user_token);