跳到主要内容

多步骤会话

在许多实际应用中,单次交互不足以完成一项任务。您可能需要引导用户完成一系列步骤,例如首先注册个人资料,然后验证资产所有权,最后签署用户协议。DID Connect 库允许您将多个会话链接在一起,形成一个单一、无缝的多步骤工作流,从而简化这些复杂的交互。

本示例演示了如何创建一个顺序的两步流程,其中第一步的成功完成会自动触发第二步。

核心机制:nextWorkflow

创建多步骤会话的关键在于 onAuth 回调的响应。通过返回一个 nextWorkflow 对象,您可以指示用户的钱包立即使用提供的 URL 启动一个新的 DID Connect 会话。

其工作原理如下:

  1. 用户完成第一个 DID Connect 会话(例如,提供个人资料)。
  2. 您的第一个会话的 onAuth 处理程序处理数据,并为第二个会话生成一个新的 DID Connect URL。
  3. onAuth 处理程序返回一个包含 nextWorkflow(新的会话 URL)和 nextToken(供您的前端跟踪新会话)的对象。
  4. DID 钱包收到此响应后,会自动启动下一个工作流,向用户呈现第二步的请求,而无需他们扫描新的二维码。

示例:个人资料和资产验证

让我们构建一个两步工作流:首先,我们请求用户的个人资料,然后,我们要求他们出示一个特定的资产。

步骤 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(`第一步已为 ${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:接收数据并请求资产

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(`第二步已为 ${userDid} 完成。出示的资产: ${asset.asset}`);

    // 这是最后一步,所以我们返回一条成功消息
    return { successMessage: '您已成功完成所有步骤!' };
  },
});

可视化多步骤流程

下图说明了在链式会话期间,用户、应用程序后端和 DID 钱包之间的交互。

Multi-Step Session

通过这种模式,您可以构建复杂且用户友好的工作流,将复杂的流程分解为简单的顺序步骤,所有这些对最终用户来说都是无摩擦的。

后续步骤

现在您已经了解了如何链接工作流,可以探索其他高级功能和示例: