跳到主要内容

出示 NFT

本示例演示了如何将应用程序中特定内容或功能的访问权限限制为拥有特定非同质化通证(NFT)或链上资产的用户。这是一种常见的 Web3 模式,用于专属会员、活动门票或特殊数字物品。

DID Connect 简化了此过程,它允许您的应用程序使用 asset 声明直接从用户的钱包请求资产所有权证明。有关此声明类型的详细参考,请参阅 资产声明文档

工作原理

NFT 门控访问的流程包括应用程序请求用户从其钱包中出示特定资产。应用程序定义了所需资产的标准,例如其发行者、父集合或唯一地址。如果用户的钱包持有匹配的资产并且他们批准了请求,应用程序将验证响应并授予访问权限。

NFT Gated Access

实现步骤

以下是使用 did-connect 处理程序实现 NFT 门控访问的方法。我们将配置一个会话,要求用户出示来自受信任发行者的 NFT。

1. 配置钱包处理程序

首先,设置你的 WalletHandlers。在 onConnect 回调中,我们将动态地将一个 asset 声明添加到请求的声明列表中。

该声明将指示钱包查找符合 filters 数组中定义的条件的资产。在本例中,我们要求提供由特定 trustedIssuers DID 创建的任何资产。

钱包处理程序设置

javascript
const { WalletHandlers } = require('@arcblock/did-connect');

const handlers = new WalletHandlers({
  authenticator: auth, // 你的 WalletAuthenticator 实例
  // ...其他配置

onConnect: async ({ claims }) => {
    // 将资产声明添加到请求中
    claims.push({
      type: 'asset',
      description: '请出示您的 VIP 会员 NFT 以访问此内容。',
      optional: false, // 将 optional 设置为 false 使其成为必需项
      filters: [
        {
          // 替换为发行你的 NFT 的机构的 DID
          trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
        },
      ],
    });
  },

  // ...其他处理程序,如 onAuth
});

2. 验证出示的资产

onAuth 回调中(该回调在用户成功响应请求后运行),你需要验证是否已出示所需的资产。

onAuth 有效负载中的 claims 数组将包含从钱包返回的数据。我们找到 asset 声明的结果,并检查它是否包含 asset 地址。如果包含,则用户已证明其所有权,我们可以授予他们访问权限。

验证钱包响应

javascript
const handlers = new WalletHandlers({
  authenticator: auth,
  // ...其他配置

  onConnect: (req) => { /* ...如上... */ },

  onAuth: async ({ claims, userDid }) => {
    // 查找我们的资产声明请求的结果
    const presentedAssetClaim = claims.find(c => c.type === 'asset');

    // `asset` 属性将包含所出示 NFT 的地址
    if (presentedAssetClaim && presentedAssetClaim.asset) {
      console.log(`Access granted to ${userDid}.`);
      console.log(`Presented Asset Address: ${presentedAssetClaim.asset}`);

      // 在这里你通常会:
      // 1. 为用户创建一个会话。
      // 2. 将他们重定向到受保护的内容。
      return {
        status: 'ok',
        message: '访问已授予',
      };
    }

    console.log(`Access denied for ${userDid}. Required NFT not presented.`);
    // 1. 抛出错误或返回特定状态以拒绝访问。
    throw new Error('未出示所需的 NFT。');
  },
});

资产声明筛选

filters 属性非常灵活。你可以根据各种标准要求资产:

  • address:NFT 的具体地址。
  • trustedIssuers:创建 NFT 的实体的 DID。
  • trustedParents:父集合 NFT 的地址。

通过组合这些筛选器,你可以为你的应用程序创建复杂的访问规则,例如要求特定活动组织者提供的特定门票 NFT。

本示例为在你的应用程序中构建强大的、去中心化的访问控制系统提供了坚实的基础。要探索另一个常见用例,请查看 交易支付示例