跳到主要內容

FederatedService

FederatedService 提供了一個用於與統一登入站點群設定互動的 API。它允許您檢索有關控制登入會話的「主」應用程式和使用者正在互動的「目前」應用程式的資訊。這對於建立像統一應用程式切換器這樣的功能,或了解使用者在相互連接的 Blocklet 群組中的會話上下文至關重要。

統一登入站點群 (Federated Login Group) 允許多個 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('Available apps:', apps);

// 然後,您可以使用這個 'apps' 陣列來呈現下拉式選單、
// 側邊欄或任何其他導覽元件。
apps.forEach(app => {
  console.log(`App Name: ${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(`You are currently on: ${currentApp.appName}`);
}

getFederatedApp()

取得統一登入站點群中主應用程式的資訊。如果目前應用程式不屬於統一登入群組,此方法將回傳 null。

回傳值

  • **** AppInfo | null — 一個包含主應用程式詳細資訊的物件,如果不在統一登入模式下,則為 null。

範例

javascript
const masterApp = sdk.federated.getFederatedApp();
if (masterApp) {
  console.log(`The master app is: ${masterApp.appName}`);
}

getFederatedEnabled()

檢查統一登入站點群功能是否已啟用並經使用者批准。

回傳值

  • **** boolean — 如果已配置統一登入且狀態為「已批准」,則回傳 true,否則回傳 false。

範例

javascript
const isFederated = sdk.federated.getFederatedEnabled();
if (isFederated) {
  console.log('Federated login is active.');
} else {
  console.log('This is a standalone application.');
}

getTrustedDomains()

非同步地獲取為統一登入站點群配置的受信任網域列表。

回傳值

  • **** Promise<Array<string>> — 一個解析為受信任網域字串陣列的 promise。

範例

javascript
async function logTrustedDomains() {
  try {
    const domains = await sdk.federated.getTrustedDomains();
    console.log('Trusted domains:', domains);
  } catch (error) {
    console.error('Failed to get trusted domains:', 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(`Metadata for ${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 文件以了解更多資訊。