在許多真實世界的應用中,單一的互動並不足以完成一項任務。您可能需要引導使用者完成一系列步驟,例如先註冊個人資料,然後驗證資產所有權,最後簽署使用者協議。DID Connect 函式庫讓您可以將多個會話串連成一個無縫的單一多步驟工作流程,從而簡化這些複雜的互動。
此範例示範了如何建立一個連續的兩步驟流程,其中第一步的成功完成會自動觸發第二步。
核心機制:nextWorkflow
建立多步驟會話的關鍵在於 onAuth 回呼的響應。透過回傳一個 nextWorkflow 物件,您可以指示使用者的錢包立即使用提供的 URL 開始一個新的 DID Connect 會話。
其運作方式如下:
- 使用者完成第一個 DID Connect 會話(例如,提供個人資料)。
- 您第一個會話的
onAuth處理器會處理資料,並為第二個會話產生一個新的 DID Connect URL。 onAuth處理器回傳一個包含nextWorkflow(新的會話 URL)和nextToken(供您的前端追蹤新會話)的物件。- DID 錢包收到此響應後,會自動啟動下一個工作流程,向使用者呈現第二步的請求,而無需他們掃描新的 QR code。
範例:個人資料與資產驗證
讓我們建立一個兩步驟的工作流程:首先,我們將要求使用者提供個人資料,然後要求他們出示一個特定的資產。
步驟 1:請求使用者個人資料
首先,我們為初始步驟設定一個端點。在 onAuth 回呼中,成功接收到使用者個人資料後,我們為第二個步驟(/api/did/multi-step/step2/token)產生一個新的會話,並將其作為 nextWorkflow 回傳。
我們也可以使用 nextWorkflowData 將資料從此步驟傳遞到下一步。在此案例中,我們將傳遞使用者的全名,以便在第二步的描述中使用。
步驟 1:請求個人資料並串連至步驟 2
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:接收資料並請求資產
// 第二步的處理器
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 錢包之間的互動。

透過這種模式,您可以建立複雜且使用者友善的工作流程,將複雜的流程分解為簡單的連續步驟,而不會對終端使用者造成任何阻礙。
後續步驟
現在您已經了解如何串連工作流程,可以探索其他進階功能和範例: