可验证凭证 (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: '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 声明对象接受以下参数来定义请求:
| Parameter | Type | Description |
|---|---|---|
description | string | 必需。 在用户钱包中显示给用户的消息,解释请求该凭证的原因。 |
optional | boolean | 如果设置为 true,用户可以跳过此声明并继续操作。默认为 false。 |
filters | array | 过滤器对象数组。钱包将查找与任何一个过滤器匹配的凭证(逻辑或)。在每个过滤器对象内部,所有条件都必须满足(逻辑与)。这是推荐的现代方法。 |
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: 'Please present your Blocklet Server Passport.',
filters: [
{
type: ['BlockletServerPassport'],
trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
},
],
}),
};按多个条件请求凭证
您可以提供多个过滤器,为用户提供更多选择。例如,您可以接受来自一个发行方的护照,或者来自另一个发行方带有特定标签的会员卡。
Request VC with multiple filters
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)以证明其所有权。