跳到主要內容

出示 NFT

此範例示範如何限制應用程式中的特定內容或功能,僅供擁有特定非同質化代幣 (NFT) 或鏈上資產的使用者存取。這是一種常見的 Web3 模式,用於專屬會員資格、活動門票或特殊數位物品。

DID Connect 簡化了此流程,允許您的應用程式使用 asset 聲明直接從使用者的錢包請求資產所有權證明。有關此聲明類型的詳細參考,請參閱 資產聲明文件

運作方式

NFT 門禁存取的流程是,應用程式請求使用者從其錢包中出示特定資產。應用程式定義所需資產的標準,例如其發行者、父集合或唯一地址。如果使用者的錢包中持有相符的資產且他們核准了該請求,應用程式將驗證回應並授予存取權限。

NFT Gated Access

實作步驟

以下是如何使用 did-connect 處理程式來實作 NFT 門禁存取。我們將設定一個會話,要求使用者出示來自受信任發行者的 NFT。

1. 設定 Wallet Handlers

首先,設定您的 WalletHandlers。在 onConnect 回呼中,我們將動態地將 asset 聲明新增至請求的聲明列表中。

此聲明將指示錢包尋找符合 filters 陣列中定義標準的資產。在此案例中,我們要求的是由特定 trustedIssuers DID 建立的任何資產。

Wallet Handler Setup

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 地址。如果包含,則表示使用者已證明所有權,我們可以授予他們存取權限。

Verifying the Wallet Response

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

  onConnect: (req) => { /* ... as above ... */ },

  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: 'Access Granted',
      };
    }

    console.log(`Access denied for ${userDid}. Required NFT not presented.`);
    // 1. 拋出錯誤或返回特定狀態以拒絕存取。
    throw new Error('Required NFT was not presented.');
  },
});

資產聲明篩選

filters 屬性非常靈活。您可以根據各種標準要求資產:

  • address:NFT 的特定地址。
  • trustedIssuers:建立 NFT 的實體的 DID。
  • trustedParents:父集合 NFT 的地址。

透過組合這些篩選器,您可以為您的應用程式建立複雜的存取規則,例如要求來自特定活動組織者的特定門票 NFT。

此範例為在您的應用程式中建立強大的去中心化存取控制系統提供了堅實的基礎。要探索另一個常見的使用案例,請查看 交易支付範例