token 模型
管理员会话与 user_token 如何配合。
Downcity 使用管理员会话 Token 管理 Federation,并使用 user_token 让终端 client 调用 service。
创建 city / 申请 user_tokenuser_token,并在内部保存 provider key。user_token 创建 User City 并调用 service。拿不到管理员凭证user_token
user_token 是给终端用户或产品 client 使用的调用凭证。它由 FederationAdmin 基于 bureau_id + user_id 向 Federation 申请。
bureau_iduser_idmetadatattl
登录开始时由产品配置明确 bureau_id;登录完成后,client 调用 service 只携带 user_token,
bureau_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);