Packages 包

Federation SDK

使用 @downcity/federation 创建 Federation,并通过 Embassy 访问用户和管理员能力。

@downcity/federation 是 Federation、Embassy 和 Bureau 领域的正式 package。

Embassy

import { Embassy } from "@downcity/federation";

const embassy = new Embassy({
  federation_url: "https://fed.example.com",
});

const providers = await embassy.user.account.providers();

Embassy 只有 user 和 admin 两个身份子域:

  • embassy.user 负责用户登录、AI、Payment、Service 和 Bureau 业务请求。
  • embassy.admin 负责管理员 Session 和 Federation 管理。

Embassy 本身不绑定 Bureau。只有登录流程需要产品分区时,才在该次登录中传入:

账户登录统一位于 embassy.user.account:

await embassy.user.account.login({
  provider: "email",
  bureau_id: "product-web",
  input: {
    email: "[email protected]",
    password: "password",
  },
});

const current_user = await embassy.user.current();

管理员使用用户名和密码登录:

await embassy.admin.login({
  admin_id: "owner",
  password: "password",
});

const bureaus = await embassy.admin.bureaus.list();
const issued = await embassy.admin.bureaus.tokens.issue({
  bureau_id: "product-web",
  purpose: "production backend",
});
const tokens = await embassy.admin.bureaus.tokens.list();

Bureau Token

Federation 根据 Admin Session 的授权生成 Bureau Token,明文只返回一次,数据库只保存 hash。 业务服务通过与 Embassy 解耦的 Bureau 客户端消费该 Token:

import { Bureau } from "@downcity/federation";

const bureau = new Bureau({
  federation_url: "https://fed.example.com",
  bureau_token: process.env.DOWNCITY_BUREAU_TOKEN!,
});

const identity = await bureau.identify(request);

bureau_token 是长期、可撤销的机器凭证。Bureau 可以调用 me()identify()user(), 但不能签发 User Token。账户登录和管理员 Token 接口最终都由 Federation 执行 User Token 签发。

package 迁移不会改变现有 HTTP endpoint、请求体、响应体、数据库结构或 Token claim。