跳到主要内容

FederatedService

FederatedService 提供了一个用于与统一登录站点群设置进行交互的 API。它允许您检索有关控制登录会话的“主”应用和用户正在交互的“当前”应用的信息。这对于创建诸如统一应用切换器之类的功能,或了解用户在相连的 Blocklet 群组中的会话上下文至关重要。

统一登录站点群(Federated Login Group)允许多个 Blocklet 共享一个用户会话,为用户在它们之间导航时提供无缝体验。一个 Blocklet 作为主应用处理身份验证,而其他 Blocklet 则是成员。

FederatedService

常见用例:构建应用切换器

FederatedService 最常见的用例是构建一个 UI 组件,列出群组中的所有应用,允许用户轻松地在它们之间切换。getApps() 方法就是专为此目的设计的。

Example: Fetching Apps for a UI Component

javascript
import { getBlockletSDK } from '@blocklet/js-sdk';

const sdk = getBlockletSDK();

// 获取统一登录站点群中的所有应用列表
// 主应用将始终位于列表的第一个。
const apps = sdk.federated.getApps();

console.log('可用应用:', apps);

// 然后,您可以使用此 'apps' 数组来渲染下拉菜单、
// 侧边栏或任何其他导航组件。
apps.forEach(app => {
  console.log(`应用名称: ${app.appName}, URL: ${app.appUrl}`);
});

API 参考

getApps()

检索与当前统一登录上下文相关的应用列表。它智能地结合了主应用和当前应用,确保在启用统一登录时主应用始终排在第一位。

返回

  • **** Array<AppInfo | ServerInfo> — 应用信息对象的数组。如果启用了统一登录,主应用始终是第一个元素。

示例

javascript
const appList = sdk.federated.getApps();
console.log(appList);

示例响应

json
[
  {
    "appId": "z1masterAppDid",
    "appName": "主应用",
    "appDescription": "该群组的主应用。",
    "appLogo": "/assets/logo.png",
    "appPid": "z8tmasterAppPid",
    "appUrl": "https://master.example.com",
    "version": "1.2.0",
    "sourceAppPid": "z8tmasterAppPid",
    "provider": "wallet"
  },
  {
    "appId": "z1currentAppDid",
    "appName": "当前成员应用",
    "appDescription": "您当前正在使用的应用。",
    "appLogo": "/assets/logo.png",
    "appPid": "z8tcurrentAppPid",
    "appUrl": "https://member.example.com",
    "version": "1.0.0",
    "sourceAppPid": null,
    "provider": "wallet"
  }
]

getCurrentApp()

获取当前正在运行的应用信息。这可以是一个标准的 Blocklet,也可以是 Blocklet Server 本身。

返回

  • **** AppInfo | ServerInfo | null — 包含当前应用详细信息的对象,如果无法确定,则为 null。

示例

javascript
const currentApp = sdk.federated.getCurrentApp();
if (currentApp) {
  console.log(`您当前位于:${currentApp.appName}`);
}

getFederatedApp()

获取统一登录站点群中主应用的信息。如果当前应用不属于统一登录站点群,此方法将返回 null

返回

  • **** AppInfo | null — 包含主应用详细信息的对象,如果未处于统一登录模式,则为 null。

示例

javascript
const masterApp = sdk.federated.getFederatedApp();
if (masterApp) {
  console.log(`主应用是:${masterApp.appName}`);
}

getFederatedEnabled()

检查统一登录站点群功能是否已启用并获得用户批准。

返回

  • **** boolean — 如果统一登录已配置且状态为“已批准”,则返回 true,否则返回 false。

示例

javascript
const isFederated = sdk.federated.getFederatedEnabled();
if (isFederated) {
  console.log('统一登录已激活。');
} else {
  console.log('这是一个独立应用。');
}

getTrustedDomains()

异步获取为统一登录站点群配置的受信任域列表。

返回

  • **** Promise<Array<string>> — 一个解析为受信任域字符串数组的 Promise。

示例

javascript
async function logTrustedDomains() {
  try {
    const domains = await sdk.federated.getTrustedDomains();
    console.log('受信任的域:', domains);
  } catch (error) {
    console.error('获取受信任的域失败:', error);
  }
}

logTrustedDomains();

getBlockletData()

异步获取并解析来自给定应用 URL 的 __blocklet__.js 元数据文件。此方法包含缓存以避免冗余的网络请求。

参数

  • appUrl string (required) — 您想获取其数据的 Blocklet 的基本 URL。
  • force boolean (default: false) — 如果为 true,则绕过缓存并获取最新数据。

返回

  • **** Promise<any | null> — 一个解析为从 blocklet.js 解析出的 JSON 数据的 Promise,失败时为 null。

示例

javascript
async function fetchMetadata(url) {
  const metadata = await sdk.federated.getBlockletData(url);
  if (metadata) {
    console.log(`${url} 的元数据:`, metadata.name, metadata.version);
  }
}

fetchMetadata('https://some-blocklet.example.com');

类型

这些是 FederatedService 方法返回的主要数据结构。

AppInfo

代表一个标准的 Blocklet 应用。

AppInfo Type

typescript
type AppInfo = {
  appId: string;
  appName: string;
  appDescription: string;
  appLogo: string;
  appPid: string;
  appUrl: string;
  version: string;
  sourceAppPid: string;
  provider: string;
};

ServerInfo

代表 Blocklet Server 实例。

ServerInfo Type

typescript
type ServerInfo = {
  appId: string;
  appName: string;
  appDescription: string;
  appUrl: string;
  sourceAppPid: string;
  provider: string;
  type: 'server';
};

现在您已了解如何使用统一登录应用,您可能希望管理用户在不同设备上的登录会话。请继续阅读 UserSessionService 文档以了解更多信息。