跳到主要内容

可验证凭证声明

可验证凭证 (Verifiable Credential, VC) 是一种数字化的、防篡改的凭证,可用于证明持有者的某些信息。可验证凭证声明允许您的应用程序请求用户从其 DID 钱包中出示特定的 VC,以证明其属性、资格或权利。

这是一种验证信息的强大方式,无需每次都联系原始发行方。常见用例包括:

  • 验证用户年龄而不泄露其出生日期。
  • 确认某个组织的成员资格。
  • 证明门票或通行证的所有权。
  • 基于特定成就或证书来限制对内容的访问。

如何请求可验证凭证

要请求可验证凭证,您需要在创建 DID Connect 会话时,在 claims 数组中包含一个 verifiableCredential 对象。您可以指定各种条件来从用户的钱包中筛选出您所需的确切凭证。

DID Connect Handler

javascript
const handlers = new WalletHandlers({
  authenticator,
  // ... other configurations
});

app.get('/api/auth/login', async (req, res) => {
  const claims = {
    verifiableCredential: {
      description: 'Please present your Blocklet Server Passport to continue.',
      filters: [
        {
          type: ['BlockletServerPassport'],
          trustedIssuers: ['zNKjDm4Xsoaffb19UE6Q_YOUR_ISSUER_DID_HERE'], // Example Issuer DID
        },
      ],
    },
  };

  // 钱包将提示用户选择一个匹配的凭证
  return handlers.auth(req, res, claims);
});

参数

verifiableCredential 声明对象接受以下参数来定义请求:

ParameterTypeDescription
descriptionstring必需。 在用户钱包中显示给用户的消息,解释请求该凭证的原因。
optionalboolean如果设置为 true,用户可以跳过此声明并继续操作。默认为 false
filtersarray过滤器对象数组。钱包将查找与任何一个过滤器匹配的凭证(逻辑或)。在每个过滤器对象内部,所有条件都必须满足(逻辑与)。这是推荐的现代方法。
claimUrlstring一个 URL,用户可以在此查看有关所请求声明的更多信息。
acquireUrlstring一个 URL,如果用户还没有所需的凭证,可以到此获取。

过滤器对象参数

filters 数组中的每个对象可以包含以下字段:

ParameterTypeDescription
typestring[]可接受的 VC 类型名称数组。凭证必须与此列表中的类型之一匹配。
trustedIssuersstring[]DID 数组。凭证必须由这些 DID 之一发行。
targetstring凭证颁发对象的主题 DID。通常,这是用户自己的 DID。
tagstring凭证上必须存在的特定标签。
ownerDidstring[]允许出示该凭证的 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

javascript
const claims = {
  verifiableCredential: () => ({
    description: 'Please present your Blocklet Server Passport.',
    filters: [
      {
        type: ['BlockletServerPassport'],
        trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
      },
    ],
  }),
};

按多个条件请求凭证

您可以提供多个过滤器,为用户提供更多选择。例如,您可以接受来自一个发行方的护照,或者来自另一个发行方带有特定标签的会员卡。

Request VC with multiple filters

javascript
const claims = {
  verifiableCredential: () => ({
    description: 'Please present a valid passport or a tagged membership card.',
    optional: true,
    filters: [
      // 选项 1:来自受信任发行方的特定类型护照
      {
        type: ['BlockletServerPassport'],
        trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
      },
      // 选项 2:来自另一个发行方的带有特定标签的任何凭证
      {
        trustedIssuers: ['zNKoA97a922N4234UE6QxVeevuaTaLCS1abc'],
        tag: 'gold_member_card',
      },
    ],
  }),
};

在此示例中,用户可以通过出示来自第一个发行方的 BlockletServerPassport,或来自第二个发行方的任何标记为 gold_member_card 的凭证来满足此请求。

成功请求可验证凭证后,您可能希望请求另一种链上数据的所有权。在下一节中学习如何操作。

下一步:资产声明

了解如何请求用户出示链上资产(例如 NFT)以证明其所有权。