可驗證憑證 (Verifiable Credential, VC) 是一種數位防竄改的憑證,可用於證明持有者的某些資訊。可驗證憑證宣告允許您的應用程式要求使用者從其 DID 錢包中出示特定的 VC,以證明某項屬性、資格或權利。
這是一種強大的資訊驗證方式,無需每次都聯繫原始發行者。常見的使用案例包括:
- 驗證使用者的年齡,而無需透露其出生日期。
- 確認組織的成員資格。
- 證明票券或通行證的所有權。
- 根據特定成就或證書來限制內容的存取權限。
如何請求可驗證憑證
要請求可驗證憑證,您需要在建立 DID Connect 會話時,在 claims 陣列中包含一個 verifiableCredential 物件。您可以指定各種條件來篩選您需要使用者錢包中的確切憑證。
DID Connect Handler
const handlers = new WalletHandlers({
authenticator,
// ... other configurations
});
app.get('/api/auth/login', async (req, res) => {
const claims = {
verifiableCredential: {
description: '請出示您的 Blocklet Server 通行證以繼續。',
filters: [
{
type: ['BlockletServerPassport'],
trustedIssuers: ['zNKjDm4Xsoaffb19UE6Q_YOUR_ISSUER_DID_HERE'], // 發行者 DID 範例
},
],
},
};
// 錢包會提示使用者選擇一個匹配的憑證
return handlers.auth(req, res, claims);
});參數
verifiableCredential 宣告物件接受以下參數來定義請求:
| Parameter | Type | Description |
|---|---|---|
description | string | 必填。 顯示在使用者錢包中的訊息,解釋請求該憑證的原因。 |
optional | boolean | 如果設定為 true,使用者可以跳過此宣告並繼續。預設為 false。 |
filters | array | 篩選物件的陣列。錢包將找到匹配任何一個篩選條件的憑證(邏輯 OR)。在每個篩選物件中,所有條件都必須滿足(邏輯 AND)。這是推薦的現代方法。 |
claimUrl | string | 一個 URL,使用者可以在此處查看有關所請求宣告的更多資訊。 |
acquireUrl | string | 一個 URL,如果使用者尚未擁有所需憑證,可以前往此處獲取。 |
篩選物件參數
filters 陣列中的每個物件可以包含以下欄位:
| Parameter | Type | Description |
|---|---|---|
type | string[] | 可接受的 VC 類型名稱陣列。憑證必須匹配此列表中的其中一種類型。 |
trustedIssuers | string[] | DID 的陣列。憑證必須由這些 DID 中的其中一個發行。 |
target | string | 憑證發行對象的 DID。通常,這是使用者自己的 DID。 |
tag | string | 憑證上必須存在的特定標籤。 |
ownerDid | string[] | 允許出示該憑證的 DID 陣列。 |
舊版參數
為了向後相容,可以在宣告物件的頂層使用以下參數。但是,對於新應用程式,建議使用 filters 陣列。
item: (string[])filters[0].type的別名。trustedIssuers: (string[])filters[0].trustedIssuers的別名。target: (string)filters[0].target的別名。tag: (string)filters[0].tag的別名。
範例
依類型和發行者請求憑證
這是最常見的使用案例。您知道您需要哪種憑證,以及您信任由誰發行。
Request a specific VC
const claims = {
verifiableCredential: () => ({
description: '請出示您的 Blocklet Server 通行證。',
filters: [
{
type: ['BlockletServerPassport'],
trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
},
],
}),
};使用多個條件請求憑證
您可以提供多個篩選條件,給予使用者更多選擇。例如,您可以接受來自某個發行者的通行證,或來自另一個發行者帶有特定標籤的會員卡。
Request VC with multiple filters
const claims = {
verifiableCredential: () => ({
description: '請出示有效的通行證或帶有標籤的會員卡。',
optional: true,
filters: [
// 選項 1:來自可信發行者的特定類型通行證
{
type: ['BlockletServerPassport'],
trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
},
// 選項 2:來自另一位發行者的任何帶有特定標籤的憑證
{
trustedIssuers: ['zNKoA97a922N4234UE6QxVeevuaTaLCS1abc'],
tag: 'gold_member_card',
},
],
}),
};在此範例中,使用者可以透過出示來自第一個發行者的 BlockletServerPassport,或來自第二個發行者且標記為 gold_member_card 的任何憑證來滿足此請求。
成功請求可驗證憑證後,您可能希望請求另一種鏈上資料的所有權。在下一節中學習如何操作。
下一步:資產宣告
了解如何要求使用者出示鏈上資產(例如 NFT)以證明所有權。