在许多实际应用中,单次交互不足以完成一项任务。您可能需要引导用户完成一系列步骤,例如首先注册个人资料,然后验证资产所有权,最后签署用户协议。DID Connect 库允许您将多个会话链接在一起,形成一个单一、无缝的多步骤工作流,从而简化这些复杂的交互。
本示例演示了如何创建一个顺序的两步流程,其中第一步的成功完成会自动触发第二步。
核心机制:nextWorkflow
创建多步骤会话的关键在于 onAuth 回调的响应。通过返回一个 nextWorkflow 对象,您可以指示用户的钱包立即使用提供的 URL 启动一个新的 DID Connect 会话。
其工作原理如下:
- 用户完成第一个 DID Connect 会话(例如,提供个人资料)。
- 您的第一个会话的
onAuth处理程序处理数据,并为第二个会话生成一个新的 DID Connect URL。 onAuth处理程序返回一个包含nextWorkflow(新的会话 URL)和nextToken(供您的前端跟踪新会话)的对象。- DID 钱包收到此响应后,会自动启动下一个工作流,向用户呈现第二步的请求,而无需他们扫描新的二维码。
示例:个人资料和资产验证
让我们构建一个两步工作流:首先,我们请求用户的个人资料,然后,我们要求他们出示一个特定的资产。
步骤 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(`第一步已为 ${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, // 供前端轮询的令牌
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(`第二步已为 ${userDid} 完成。出示的资产: ${asset.asset}`);
// 这是最后一步,所以我们返回一条成功消息
return { successMessage: '您已成功完成所有步骤!' };
},
});可视化多步骤流程
下图说明了在链式会话期间,用户、应用程序后端和 DID 钱包之间的交互。

通过这种模式,您可以构建复杂且用户友好的工作流,将复杂的流程分解为简单的顺序步骤,所有这些对最终用户来说都是无摩擦的。
后续步骤
现在您已经了解了如何链接工作流,可以探索其他高级功能和示例: