跳到主要內容

多步驟會話

在許多真實世界的應用中,單一的互動並不足以完成一項任務。您可能需要引導使用者完成一系列步驟,例如先註冊個人資料,然後驗證資產所有權,最後簽署使用者協議。DID Connect 函式庫讓您可以將多個會話串連成一個無縫的單一多步驟工作流程,從而簡化這些複雜的互動。

此範例示範了如何建立一個連續的兩步驟流程,其中第一步的成功完成會自動觸發第二步。

核心機制:nextWorkflow

建立多步驟會話的關鍵在於 onAuth 回呼的響應。透過回傳一個 nextWorkflow 物件,您可以指示使用者的錢包立即使用提供的 URL 開始一個新的 DID Connect 會話。

其運作方式如下:

  1. 使用者完成第一個 DID Connect 會話(例如,提供個人資料)。
  2. 您第一個會話的 onAuth 處理器會處理資料,並為第二個會話產生一個新的 DID Connect URL。
  3. onAuth 處理器回傳一個包含 nextWorkflow(新的會話 URL)和 nextToken(供您的前端追蹤新會話)的物件。
  4. DID 錢包收到此響應後,會自動啟動下一個工作流程,向使用者呈現第二步的請求,而無需他們掃描新的 QR code。

範例:個人資料與資產驗證

讓我們建立一個兩步驟的工作流程:首先,我們將要求使用者提供個人資料,然後要求他們出示一個特定的資產。

步驟 1:請求使用者個人資料

首先,我們為初始步驟設定一個端點。在 onAuth 回呼中,成功接收到使用者個人資料後,我們為第二個步驟(/api/did/multi-step/step2/token)產生一個新的會話,並將其作為 nextWorkflow 回傳。

我們也可以使用 nextWorkflowData 將資料從此步驟傳遞到下一步。在此案例中,我們將傳遞使用者的全名,以便在第二步的描述中使用。

步驟 1:請求個人資料並串連至步驟 2

javascript
const { WalletHandlers, WalletAuthenticator } = require('@arcblock/did-connect-js');
const SimpleStorage = require('@arcblock/did-connect-storage-nedb');
const { fromRandom } = require('@ocap/wallet');
const axios = require('axios');

// 假設 authenticator 和 handlers 已經初始化
const wallet = fromRandom();
const authenticator = new WalletAuthenticator({ /* ...config... */ });
const handlers = new WalletHandlers({
  authenticator,
  tokenStorage: new SimpleStorage({ dbPath: '/tmp/multi-step.db' }),
});

// 第一步的處理器
handlers.attach({
  app: server, // 您的 Express 應用程式實例
  action: 'multi-step/step1',
  claims: {
    profile: () => ({
      fields: ['fullName', 'email'],
      description: '步驟 1:請提供您的個人資料。',
    }),
  },
  onAuth: async ({ claims, userDid, req }) => {
    const profile = claims.find((x) => x.type === 'profile');
    console.log(`步驟 1 完成,使用者 DID:${userDid}。個人資料名稱:${profile.fullName}`);

    // 為工作流程中的下一步產生 URL
    const baseUrl = `${req.protocol}://${req.get('host')}`;
    const { data } = await axios.get(`${baseUrl}/api/did/multi-step/step2/token`);

    return {
      nextWorkflow: data.url, // 錢包下一步要開啟的 URL
      nextToken: data.token,    // 供前端輪詢的 token
      nextWorkflowData: {      // 要傳遞到下一步的資料
        fullName: profile.fullName,
      },
    };
  },
});

步驟 2:請求資產

接下來,我們為第二個步驟定義處理器。此處理器將透過 extraParams.previousWorkflowData 物件接收從步驟 1 傳遞過來的資料。我們可以使用這些資料來自訂聲明,例如,個人化描述。

步驟 2:接收資料並請求資產

javascript
// 第二步的處理器
handlers.attach({
  app: server, // 您的 Express 應用程式實例
  action: 'multi-step/step2',
  claims: {
    asset: ({ extraParams }) => {
      // 從上一步存取資料
      const { fullName } = extraParams.previousWorkflowData;
      return {
        description: `嗨 ${fullName},請出示您的 NFT 以完成流程。`,
        trustedIssuers: ['zNKjDm4Xsoaffb19a41w3g9d3AZp2k1YxV4a'], // 範例發行者 DID
      };
    },
  },
  onAuth: async ({ claims, userDid }) => {
    const asset = claims.find((x) => x.type === 'asset');
    console.log(`步驟 2 完成,使用者 DID:${userDid}。出示的資產:${asset.asset}`);

    // 這是最後一步,所以我們回傳一條成功訊息
    return { successMessage: '您已成功完成所有步驟!' };
  },
});

多步驟流程視覺化

下圖說明了在串連會話期間,使用者、應用程式後端和 DID 錢包之間的互動。

Multi-Step Session

透過這種模式,您可以建立複雜且使用者友善的工作流程,將複雜的流程分解為簡單的連續步驟,而不會對終端使用者造成任何阻礙。

後續步驟

現在您已經了解如何串連工作流程,可以探索其他進階功能和範例: