Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档规定了一个 API,使用户代理 能够对 出示和签发数字 凭证进行中介,例如 驾驶执照、政府签发的身份证件或 其他类型的数字凭证。 该 API 建立在凭证管理第 1 级之上,并且 被设计为与 凭证格式无关。
本节描述本文档 发布时的状态。当前W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
本文档由联合身份工作 组使用 推荐标准 流程作为工作草案发布。
作为 工作草案发布并不意味着 W3C 及其成员认可本文档。
本文档是一份草案,可能随时被其他 文档更新、替换或废弃。除将本文档引用为 正在进行的工作外,以其他方式引用本文档均不适当。
本文档由一个 根据 W3C 专利 政策运作的工作组编制。 W3C 维护一份 任何专利披露的公开列表, 这些披露与该工作组的交付成果有关; 该页面还包括 披露专利的说明。任何实际 知晓某项专利并认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025年8月18日 W3C 流程文档约束。
本节为非规范性内容。
本文档定义了一个 API,使网站能够请求数字凭证的出示 和签发。
该 API 与凭证格式无关,并被设计为可扩展 以支持多种出示协议和 签发协议。参见5. 协议。
该 API 旨在支持以下目标:
可以使用此 API 出示和签发多种类型的数字凭证。 这些类型的 示例包括:
本节为非规范性内容。
以下示例说明如何使用API 请求和签发数字凭证。
在使用API之前,检查用户 代理是否支持所需特性非常重要。可以使用 以下代码进行检查:
if (typeof DigitalCredential !== "undefined") {
// 支持该 API
} else {
// 不支持该 API
}
userAgentAllowsProtocol()
静态方法可用于
检查用户代理是否允许将特定协议用于
数字凭证签发或出示。这对于
在进行 API 调用之前检查用户浏览器允许哪些协议很有用。在实现了DigitalCredential
的浏览器中(可通过上面所示的 typeof 检查来检测),随着用户代理逐步采用对协议标识符的支持,这些标识符
会逐步添加到DigitalCredentialProtocol
中,因此使用未知
协议标识符调用此方法会安全地返回 false,而不会
抛出异常。请注意,如果在未定义DigitalCredential 的浏览器中调用此
方法,则会抛出ReferenceError,因此在使用此
方法之前,仍然需要上面所示的 typeof DigitalCredential !==
"undefined" 防护检查。
if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
// 支持 DC API。继续进行签发或出示。
} else {
// 不支持 DC API。例如,回退到
// 传统的基于 HTML 表单的方法。
showHTMLForm();
}
或者,可以检查对多个协议的支持, 并筛除不受支持的协议:
const protocols = [
"example-issuance-protocol",
"another-issuance-protocol"
];
const supportedProtocols = protocols.filter(DigitalCredential.userAgentAllowsProtocol);
if (supportedProtocols.length > 0) {
// 至少支持一个协议。继续进行签发。
} else {
// 不支持任何协议。回退到其他签发方法。
}
由于协议标识符会逐步添加到DigitalCredentialProtocol
中,因此可以使用此方法优先选择较新的协议,同时
在旧版浏览器上平稳回退到较旧的协议:
// 按偏好顺序排列;在实现 DigitalCredential 的浏览器中,
// 未知协议会返回 false,而不是抛出异常。
const protocol = [
"example-new-protocol",
"example-legacy-protocol",
].find(DigitalCredential.userAgentAllowsProtocol);
if (protocol) {
// 使用此浏览器支持的最佳协议。
} else {
// 未找到支持的协议。回退到其他方法。
}
以下示例展示如何使用
API 请求数字凭证。该 API 的入口点是
navigator.credentials.get() 方法,
该方法
用于从用户代理请求数字凭证。如果
用户代理支持出示,则允许用户通过数字凭证选择器选择数字
凭证:
<button>验证身份</button>
<script>
const button = document.querySelector("button");
button.addEventListener("click", async () => {
const protocol = "example-request-protocol";
// 检查 DC API 和协议支持情况
if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
// 浏览器不允许使用此协议。
// 回退到其他验证方法。
showTraditionalVerificationForm();
return;
}
try {
const credential = await navigator.credentials.get({
digital: {
requests: [{
protocol,
data: { /* 出示请求数据 */ }
}]
}
});
// 将其发回验证者服务器进行解密和验证
const response = await fetch("/verify-credential", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(credential)
});
// 检查响应
if (!response.ok) {
throw new Error("Failed to verify credential");
}
// 呈现验证结果
displayVerificationResult(await response.json());
} catch (error) {
console.error("Error requesting digital credential:", error);
}
});
</script>
类似地,当站点需要签发一个 数字凭证时,数字凭证 API通过凭证管理器选择器,在站点、用户代理和 持有者的凭证管理器之间协调数字凭证的签发。
以下示例展示如何使用数字
凭证 API请求签发数字
凭证。要签发
数字凭证,网站会调用
navigator.credentials.create()
方法,
如果用户代理支持签发,该方法将启动签发
流程:
<button>请求签发数字凭证</button>
<script>
const button = document.querySelector("button");
button.addEventListener("click", async () => {
const protocol = "example-issuance-protocol";
// 检查 DC API 和协议支持情况
if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
// 浏览器不允许使用此协议。
// 回退到其他签发方法。
showTraditionalIssuanceForm();
return;
}
try {
const credential = await navigator.credentials.create({
digital: {
requests: [{
protocol,
data: { /* 签发请求数据 */ }
}]
}
});
} catch (error) {
console.error("Error issuing digital credential:", error);
}
});
</script>
本规范允许通过 "digital-credentials-get" 策略控制特性,使用该 API 从远程/第三方源出示凭证。这 对于网站希望从托管在不同 源上的验证服务请求数字 凭证的场景很有用。可以在嵌入 希望使用该 API 的网站的 iframe 上设置权限策略。下面是一个 在 iframe 上设置权限策略的示例:
<iframe src="https://verifier-service.example.com"
allow="digital-credentials-get">
</iframe>
类似地,本规范允许通过 "digital-credentials-create" 策略控制特性,使用该 API 从远程/第三方源签发 凭证。这 对于网站希望使用不同源上的签发服务来请求签发 数字凭证的场景很有用。可以在嵌入签发者 界面的 iframe 上设置权限策略。下面是一个示例:
<iframe src="https://issuer.example.com"
allow="digital-credentials-create">
</iframe>
本节为非规范性内容。
以下事项属于本规范的范围:
以下事项不在本规范范围内:
本节中定义的目标是复用或建立 各种数字凭证格式 和协议共有的术语。这些定义仍在积极演进中。
本规范目前重点关注 与人员有关的数字凭证。
用户代理必须支持受支持出示和签发协议 表中列出的所有出示 协议。用户代理也推荐支持 该表中列出的所有签发协议。
| 标识符 | 规范 |
|---|---|
| 出示协议 | |
openid4vp-v1-unsigned
|
OpenID 可验证 出示 1.0 § A.3.1. 未签名请求 |
openid4vp-v1-signed
|
OpenID 可验证 出示 1.0 § A.3.2. 已签名 请求 |
openid4vp-v1-multisigned
|
OpenID 可验证 出示 1.0 § A.3.2.2. JWS JSON 序列化(多重签名请求) |
org-iso-mdoc
|
ISO/IEC 18013-7:2025 符合 ISO 的 驾驶执照,第 7 部分:移动驾驶执照(mDL)附加功能 § 附录 C |
| 签发协议 | |
openid4vci-v1
|
OpenID
可验证凭证签发 1.0 § 即将推出
议题:
API 集成
|
给定一个
DigitalCredentialGetRequest 或DigitalCredentialCreateRequest
request,要转换请求协议:
DigitalCredentialGetRequest:
protocol。
DigitalCredentialPresentationProtocol
中的任何枚举值,
返回失败。
DigitalCredentialPresentationProtocol
枚举值。
DigitalCredentialCreateRequest:
protocol。
DigitalCredentialIssuanceProtocol
中的任何枚举值,
返回失败。
DigitalCredentialIssuanceProtocol
枚举值。
凭证请求协调器 是由用户代理定义的组件,通过顶级可遍历对象对数字 凭证 交互进行中介。每个顶级可遍历对象都恰好有一个关联的 协调器。该协调器 确保所有子可导航对象中最多只有一个交互处于活动状态,协调出示或 签发的端到端流程,并管理交互状态之间的转换。
凭证请求协调器维护一个活动 promise,用户
代理将其初始化为 null。通过此Promise,
协调器将异步
凭证请求工作流的状态反映给脚本,并在
交互成功完成时以凭证
响应兑现,或者在处理失败、
用户通过 UI 取消请求,或脚本通过AbortSignal中止
操作时拒绝。
凭证请求协调器维护一个中止信号,用户代理
将其初始化为 null。
凭证请求协调器维护一个中止算法,用户
代理将其初始化为 null。
用户代理可以根据用户或平台策略,将部分或全部协调器职责委托给 外部凭证管理器、平台组件或其他受信任 实体。
凭证请求协调器具有一组有限的 交互 状态,用于管理凭证 请求的生命周期:
给定一个Window global、一个源 origin、一个
序列,其值为DigitalCredentialGetRequest
或一个序列,
其值为DigitalCredentialCreateRequest
requests,以及一个可选的
AbortSignal signal,要准备凭证
请求:
Document。
InvalidStateError" DOMException,位于
realm 中。
NotAllowedError" DOMException 拒绝的 promise,该异常位于
realm 中。
NotAllowedError" DOMException 拒绝的 promise,该异常位于
realm 中。
NotAllowedError"
DOMException 拒绝 promise。
null。
预先中止的信号
会在调用此算法之前由请求一个
Credential和创建一个
Credential处理。
AbortError" DOMException 中止凭据请求。
true,则返回 promise。
给定一个由DigitalCredentialGetRequest 或
DigitalCredentialCreateRequest
对象组成的序列 requests,要筛选凭证
请求:
给定一个由DigitalCredentialGetRequest 或
DigitalCredentialCreateRequest
对象组成的序列 requests,要验证凭证
请求:
DigitalCredentialGetRequest,
令 data 为 request 的data;
或者,如果 request 是
DigitalCredentialCreateRequest,
则为 request 的
data。
除协议定义的要求外,用户代理 还可能根据本地策略、 配置或用户的选择应用验证条件。例如,用户代理可能拒绝请求 特定凭证 属性的请求。
什么构成验证失败由具体协议决定,但 如何将此类失败归类为异常类型则 定义如下:
NotAllowedError”
DOMException。
“NotAllowedError”
被有意设计为
与用户取消操作时返回的错误无法区分,
这样网站就无法
判断请求是被用户
还是被用户代理拒绝,
也无法推断有关
用户配置或凭证的任何信息。
SecurityError”
DOMException。
TypeError。
OperationError”
DOMException。
给定一个 JavaScript 值 error,要中止 凭证请求:
给定一个(JavaScript 值)error 和一个
Promise promise,要使用给定错误拒绝
凭证请求:
给定一个Document
document、一个由已验证凭证请求组成的列表
validatedRequests、一个Promise
promise,以及一个可选的AbortSignal signal,要发起
凭证请求:
当用户代理与位于另一设备上的凭证管理器 通信时,用户代理推荐使用客户端 到验证器协议(CTAP)。
NotAllowedError”
DOMException。
NotAllowedError”
DOMException。
TypeError。
InvalidStateError”
DOMException。
OperationError”
DOMException。
null 且
abortAlgorithm
不为 null,从
abortSignal 中移除
abortAlgorithm。
null。
null。
DigitalCredential
实例,其
data
初始化为
parsedResponseDataOrError,其
protocol
初始化为 protocol。
null。
数字凭证 API 利用 凭证管理第 1 级 规范,使用户代理能够 协调签发和出示数字 凭证。
该 API 允许向用户代理请求一个
数字凭证,用户代理随后向用户呈现一个
数字凭证选择器,允许用户
选择一个
数字凭证来满足该请求。这是
通过
网站调用
navigator.credentials.get() 方法实现的,该方法
运行
凭证管理第 1 级的请求一个 Credential算法。
然后,该算法回调本规范的
DigitalCredential 接口的
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
内部方法。
此外,该 API 还允许请求
签发一个数字凭证,这随后会
向用户呈现一个凭证管理器选择器,允许用户
选择一个凭证管理器来保存该数字凭证。这
是通过调用
navigator.credentials.create() 方法实现的,
该方法
运行凭证管理第 1 级的创建凭证算法。然后,该
算法回调本
规范的DigitalCredential 接口的
[[Create]](origin, options, sameOriginWithAncestors)
内部方法。
通过此 API 进行的数字凭证签发 与数字凭证出示略有不同。 响应数据包含持有者的 凭证管理器根据签发 协议定义返回的协议特定响应,而并不 表示实际签发的数字凭证本身。
有关如何与 凭证管理第 1 级 规范集成的完整细节,请参见凭证管理 集成。
WebIDLpartial dictionary CredentialRequestOptions {
DigitalCredentialRequestOptions digital;
};
digital 成员
允许通过选项配置对数字凭证的请求。
WebIDLdictionary DigitalCredentialRequestOptions {
required sequence<DigitalCredentialGetRequest> requests;
};
DigitalCredentialGetRequest
字典表示一个出示请求。它用于
指定一个出示协议和一些出示请求数据,用户代理可以将其与
凭证管理器(例如数字钱包)进行匹配。
WebIDLdictionary DigitalCredentialGetRequest {
required DOMString protocol;
required object data;
};
protocol 成员
表示出示协议。
protocol 成员的值
是
DigitalCredentialPresentationProtocol
中定义的协议标识符之一。
WebIDLpartial dictionary CredentialCreationOptions {
DigitalCredentialCreationOptions digital;
};
digital 成员
允许通过选项配置数字凭证的签发。
WebIDLdictionary DigitalCredentialCreationOptions {
required sequence<DigitalCredentialCreateRequest> requests;
};
DigitalCredentialCreateRequest
字典表示一个签发请求。它用于指定
一个签发协议和一些签发请求数据,以在
签发者和持有者之间传达签发请求。
WebIDLdictionary DigitalCredentialCreateRequest {
required DOMString protocol;
required object data;
};
protocol
成员表示签发协议。
protocol 成员的
值是
DigitalCredentialIssuanceProtocol
中定义的协议标识符之一。
DigitalCredential 接口表示一个概念上的
数字凭证。
DigitalCredential
接口要求所有操作都进行用户介入,以确保用户控制和同意。
为了简化开发者使用涉及DigitalCredential 的get()
调用的体验,如果mediation 成员
不存在
或其值不是“required”,用户代理不得抛出
错误。
类似地,在涉及
DigitalCredential 的create()
调用中,如果
mediation 成员
不存在或其值
不是“required”,用户
代理不得抛出错误。
这使
“required”
介入成为该 API 隐含且
不可覆盖的行为。
WebIDLtypedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;
[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
[Default] object toJSON();
readonly attribute DigitalCredentialProtocol protocol;
[SameObject] readonly attribute object data;
static boolean userAgentAllowsProtocol(DOMString protocol);
};
data 成员是
凭证的响应数据。它包含可由 JSON 解析的
对象类型子集。
userAgentAllowsProtocol()
方法允许数字
凭证验证者确定用户代理允许哪些出示协议和签发协议。
用户代理不得根据硬件可用性、软件的存在或配置、 凭证管理器或数字凭证的任何信息, 或用户配置或 偏好来改变响应值。如果响应值发生变化,用户代理会引入 指纹识别风险,并可能静默泄露 有关用户行为或配置的其他细节。响应值应该仅 随用户代理主版本变化,并指示浏览器是否支持 将使用该协议的请求分发到底层平台或 提供方。
给定一个
DOMString protocol,
要检查用户代理是否允许协议,
执行以下步骤:
DigitalCredentialProtocol
的枚举值,
返回 false。
true,否则返回
false。
调用此方法时,用户代理必须返回给定 protocol 执行用户代理允许协议的结果。
本规范中支持
DigitalCredential 的数据结构,例如枚举。
WebIDLenum DigitalCredentialPresentationProtocol {
"openid4vp-v1-unsigned",
"openid4vp-v1-signed",
"openid4vp-v1-multisigned",
"org-iso-mdoc"
};
DigitalCredentialIssuanceProtocol
枚举
WebIDLenum DigitalCredentialIssuanceProtocol {
"openid4vci-v1",
};
调用时,如果用户代理不
支持出示请求(例如,平台
无法提供数字凭证选择器),
[[DiscoverFromExternalSource]](origin, options,
sameOriginWithAncestors) 内部方法调用
Credential 的
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
内部方法的默认实现,并传入相同参数。
否则:
调用时,[[Store]](credential, sameOriginWithAncestors)
必须调用Credential 的
[[Store]](credential, sameOriginWithAncestors)
内部
方法的默认实现,并传入相同参数。
调用时,如果用户代理不
支持签发请求,[[Create]](origin, options,
sameOriginWithAncestors) 内部方法调用Credential 的[[Create]](origin, options, sameOriginWithAncestors)
内部方法的默认实现,并传入相同
参数。否则:
DigitalCredential接口对象具有一个名为
[[type]]
的内部槽,其值为 "digital"。
DigitalCredential接口对象具有一个名为
[[discovery]]
的内部槽,其值为 "remote"。
本节为非规范性内容。
数字凭证
API是一个强大特性,需要终端用户的明确许可。此
要求在调用CredentialsContainer 的
get()
方法时以规范性方式强制执行。
本规范定义了两个策略控制特性:
Credential
算法作为策略执行点。
Credential算法
作为
策略执行点。
本节为非规范性内容。
以下各节描述该 API 的安全属性、 范围内的威胁、安全性所依赖的假设,以及 应用缓解措施后仍然存在的残余威胁。本 规范仅针对用户代理在 对凭证响应进行中介时的行为定义要求。
其他依赖于协议、凭证 管理器实现、操作系统或传输安全性的安全考虑 被描述为预期或前置条件,但除非已经以规范性方式 规定,否则这些内容并非 本规范的规范性要求。
本规范的威胁模型包括针对该 API 以及生态系统相邻标准的威胁。
范围内威胁是由 DC API 本身引入或处理的威胁。以下是本 规范的范围内威胁:
DigitalCredentialGetRequest
或DigitalCredentialCreateRequest。
iframe)
请求或签发数字凭证,而没有
获得嵌入网站的明确许可,这可能会导致
凭证收集或对敏感用户数据的未经授权访问。
超出范围的威胁是指由协议、 凭据管理器、操作系统平台安全机制或 传输层处理的威胁。 即使这些威胁“超出范围”,它们仍然具有相关性,因为它们会影响 凭据出示和签发的端到端安全性。以下内容定义了本 规范的超出范围的威胁:
以下缓解措施通过规范中的规范性要求应对范围内威胁。
Digital Credential API 的 WebIDL 接口仅在 安全上下文中公开,从而降低通过篡改的风险,这些篡改来自 不安全上下文(例如,通过网络注入恶意脚本)。有关更多信息,请参阅 安全 上下文规范的 § 5 安全注意事项一节。
为了降低针对底层平台的 恶意载荷风险,用户代理使用JSON 序列化将请求参数传递给凭据管理器(参见 验证凭据请求)。底层 平台和凭据管理器负责在对这些 特定于协议的 JSON 载荷执行操作之前,对其进行可靠的解析和验证。
Digital Credentials API 通过两种 机制减少API 泛滥:
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
和 [[Create]](origin, options, sameOriginWithAncestors)
方法都会消耗用户激活,从而防止在没有用户
交互的情况下自动或重复发出请求。
required"
(参见DigitalCredential
接口),确保每次凭据
操作都通过平台的凭据选择器接口获得用户许可。
有关防止滥用凭据请求的其他指导, 请参阅 凭据管理第 1 级 规范的 § 7 隐私注意事项一节。不过需要注意的是,这些 保护措施存在局限性,因为网站仍可能采用暗黑模式 来诱导用户进行不必要的交互,从而触发凭据 请求。
Digital Credentials API 通过与
权限策略集成(参见权限策略
集成),减少跨源滥用。
请求一个 Credential和创建一个 Credential算法
分别作为
"digital-credentials-get" 和
"digital-credentials-create" 策略控制特性的策略执行
点。这两个特性是有意分开的:网站可以启用
"digital-credentials-get" 而不启用
"digital-credentials-create",反之亦然,
从而将每个
嵌入式上下文限制为仅具有其所需的能力。有关此集成提供的其他安全
属性,请参阅
权限策略规范的
权限策略一节。
此外,来自不透明源的请求会被拒绝。由于
DigitalCredential 实例是源绑定的,因此从不透明源请求或创建数字凭据的调用(例如
data: 文档,或在没有
allow-same-origin 的情况下被沙盒化的文档)会被凭据管理第 1 级拒绝,
从而降低恶意从不受信任的
环境中提取或欺骗的风险。
当出示协议提供一种 对请求进行签名的方式时,强烈建议验证者使用该方式。
未签名的请求可能被运行在 验证者自身页面中的脚本修改,例如由恶意浏览器 扩展注入的脚本。该脚本可以更改所请求的内容,将一个 范围有限的请求变成要求提供更多内容的请求,并且还可以替换 用于加密 响应的参数,使响应被加密给攻击者,而 不是验证者。要求在安全上下文中使用该 API 并不能阻止这种情况,因为 攻击者已经 位于该上下文内部。对于未签名的请求,凭据管理器只能 相信验证者已使自己的页面不包含此类 脚本。另一方面,已签名的请求会为凭据管理器提供可供检查的内容,因此这种 更改可以被检测到,而 不会在未被察觉的情况下通过。
即便如此,只有当凭据管理器能够 判断签名属于发出请求的验证者时,签名才有帮助。页面 内的脚本可以使用自己的密钥对被修改的请求重新签名,因此 除非能够依据一个已被 识别为属于验证者的签名密钥来检查签名,否则签名无法防御此类攻击者。 接受哪些签名密钥,以及如何 建立这些密钥,由凭据 所属的生态系统决定,而不是由本规范决定,并且 已签名请求实际提供的保护取决于该决定。除了 防止同一设备上的页面内篡改之外,请求签名 在跨多个设备出示凭据时还提供关键的纵深防御(参见 10.4 跨设备安全与邻近性)。
Digital Credentials API 支持跨设备体验,在这种体验中, 用户从辅助设备出示数字凭据,例如由智能手机充当凭据管理器,并将其出示给主 设备,例如笔记本电脑。虽然具体的数据交换 协议(例如,加密格式和传输方式)不在 此 API 的范围内,但这类跨设备交互通常依赖 已建立的协议,例如客户端到认证器协议 (CTAP)(客户端 到认证器协议 (CTAP))。
这些协议通过建立加密安全 信道并强制要求物理邻近性(例如,通过蓝牙 低功耗)来确保安全,以缓解远程中继攻击。关键的是,在 跨设备流程中,凭据管理器不能天然信任 由主设备转发的源字符串,因为主 设备或其浏览器可能已被攻陷。因此,采用 已签名请求的协议,其中验证者以加密方式 证明其身份,相比仅依赖浏览器声明的源,能够提供显著更强的安全 保证。
本节为非规范性内容。
随着本文档不断演进,本节仍在编写中。
数字凭证 API 集成于一个复杂的生态系统中,该生态系统具有 多个技术层和各种参与者(包括但不限于 验证者、持有者和签发者),其中每个参与者 都必须考虑用户隐私的不同方面。本规范 并不试图详尽列出 不同参与者的所有考虑事项。我们希望将这些参与方引导至 多种从更整体角度探讨数字凭证威胁 模型的其他资源:
相反,这些考虑聚焦于数字凭证 API 本身,并描述用户代理如何在实现该 API 时履行其用户代理职责, 同时考虑与其交互的生态系统的 相关隐私属性。
数字凭证的隐私考虑并非静态不变。随着生态系统 成熟,它们会随时间演进,并且可能受到 生态系统中其他参与者行为、技术栈其他 层的改进、对用户隐私的新威胁,以及不断变化的 社会规范和法规的影响。
期望参与数字凭证 API 设计和 实现的各个工作组积极监测 不断变化的隐私环境,并参与 API 相应的 演进。
数字凭证 API 被设计用于对网站发出的 数字凭证请求进行中介,并与凭证 格式、其中包含的信息,以及用于 交换该凭证的协议无关。这一设计以及其他关键设计选择源于 一个目标:为用户提供相比现有替代方案(例如 [custom-schemes])更安全且更注重隐私的凭证 交换体验,同时仍与常见交换 协议兼容,以便于采用。
API 提供验证者与 持有者之间的连接接口,即用于启动凭据呈现协议以及用户切换到持有者应用程序以选择凭据的方式。过去用于此目的的解决方案包括二维码和自定义 URL 方案。如 在 Web 上呈现凭据和 身份呈现中的自定义方案相关问题 所述,这些解决方案存在安全性、隐私性和可访问性方面的问题。
随着数字凭据技术的采用受到生态系统需求和监管要求的推动,Web 平台为上述不理想的技术提供了一种替代方案,该方案易于开发者使用,与现有的凭据 呈现协议兼容,并且最重要的是, 相比上述替代方案,为用户提供了更好的隐私、安全性和可访问性特性。
数字凭证 API 使用户 代理能够 代表用户进行中介协调(例如,以数字凭证选择器或凭证管理器选择器的形式),以便 为请求提供上下文并 防止 立即暴露给持有者应用程序。它还对 支持的协议实施某些最低要求,例如 响应 加密。
数字凭证 API 服务于具有 不同数据披露程度的各种用例,也服务于 根据所处上下文而具有不同偏好的不同用户。 值得注意的是,由 此 API 中介的凭证交换的隐私属性可能会受到 单个用户所处法律和监管环境的强制要求。
这意味着某些用户可能不希望或不被允许使用 最能保护隐私的凭证信息交换方式。 尽管如此,用户代理仍需要为用户提供 默认保护隐私的体验,并保护他们免受伤害。
由于存在这种偏好和用例范围, 用户代理可能很难判断用户是否有意 暴露其个人信息,还是受到诱骗而这样做。 因此,用户代理有责任确保每个 用户在交换开始之前都了解自己正在共享哪些数据,以及谁将参与 信息交换。
由于数字凭证 API 位于 涉及多个独立参与方的交换中心,这些参与方用于 交换用户信息的出示协议和凭证格式对于 用户代理保护用户隐私的目标至关重要。
我认为有两项协议要求需要进一步阐明:
必须已经过隐私审查 [...]
以及
必须已经过安全审查 [...]
从技术上讲,一份声称“这个协议在各方面都很糟糕”的审查也满足这些 标准。
如果存在一套协议必须满足的具体隐私和安全 要求会更有用,这样审查就能够判断某个 标准是否已经达到。审查中可能存在一些主观因素, 但也应该存在每个协议都必须达到的最低门槛。
这超出了当前纳入标准中的现有要求。我手头没有完整的清单,但应该 可以制定一份。一旦制定,该清单就应该写入规范。例如, 协议是否依赖“回传”?协议(或其传输的格式)是否保证出示的 不可关联性?或者——鉴于不可关联性对于某些用例并无意义——API 在什么 条件下要求协议提供不可关联性?协议提供哪些透明度 机制?哪些类型的隐蔽信道是可以接受的?
选择性披露是用于数据最小化的一项基础技术, 它允许持有者共享验证者请求的最低必要信息。预期协议能够通过允许验证者指定所需的确切声明,来支持选择性披露。
不可链接性 是一种属性,用于确保如果用户多次呈现凭据中的属性,验证者无法将这些独立的呈现关联起来,从而推断它们涉及同一用户 (验证者-验证者可链接性),或者验证者无法与发行者串通,以报告从凭据管理器向发行者交换凭据的情况(验证者-发行者 可链接性)。前者是一种可以由持有者和发行者维护的属性,例如通过为各个验证者签发新的凭据。
虽然后者可以通过例如 零知识 证明实现, 但 API 的设计选择(例如加密响应)使得用户代理无法证明验证者-发行者不可链接性在实际中已经实现。不过,协议应尽可能限制可链接性。
请注意,不可链接性仅针对无法与特定用户身份关联的属性进行考虑。固有可链接的属性,例如姓名、驾驶执照号码或电话号码,不会从不可链接性中受益。
通过 Digital Credentials API,用户 代理可以帮助 验证者和凭据管理器交换不可关联的 属性,但由于响应加密,它无法保证 验证者与 凭据管理器之间不会传递任何可关联的信息。建议 用户代理 在其用户许可体验中考虑这一事实。
此 API 的目标是哪种程度的不可关联性?我们能否 以规范性方式强制支持任何特定的不可关联性 特性?
“回传 信息”是指 数字凭据的出示或验证导致向 签发者或其他中心实体发回通知或通信的情形,这可能导致对个人的 跟踪和 用户画像。
与不可关联性类似,用户 代理无法 确保在用户授予 继续处理凭据请求的许可后,签发者不会主动参与凭据出示的创建或 验证。从那时起, 凭据管理器负责作出这一决定。 虽然某些凭据 管理器可以被视为用户 代理,但通常 建议实现 Digital Credentials API 的用户代理设计其许可 体验,以防止在用户确认之前 将 请求暴露给凭据管理器 (同时应考虑集成多个协作用户代理的 注意事项)。
签发者参与凭证交换的一个常见情形 是进行凭证撤销检查。当出示旨在实现 验证者—签发者不可关联时,这尤其具有挑战性。 当通过例如零知识 证明 使凭证出示不可关联时, 协议中使用的凭证格式应支持 密码学 累加器等离线撤销方法。还期望协议设计和 规范尽可能不鼓励验证者为 撤销目的而参与。
我们应该讨论不可关联撤销技术是否 足够实用,可以作为规范性要求。
用户的理解和参与是凭证出示中不可妥协的属性。 协议应通过提供 作出知情许可和/或同意所必需的信息,帮助所有 相关参与方实现用户参与。
为了防止用户信息在“传输”过程中暴露给其他方,例如加载在验证者 页面上的浏览器扩展程序,并鼓励验证者安全存储用户凭据,协议必须支持并要求在凭据交换中使用加密响应。
与#49以及我们进行过的其他几次 讨论有关:我们是否要规定响应必须始终加密 (如果是,应使用哪些算法),还是可以将其保留为可选?
不必要的凭证请求是整个 数字凭证生态系统的一项主要隐私风险。它们可能以不同方式 出现,并具有不同动机:
这里的一个挑战是确定什么构成“有效”目的, 因而哪些请求属于“不必要”,这需要 参与凭证交换的所有各方共同参与。
为了更详细地探讨如何确定和处理 不必要的使用,分别考虑政府签发的 凭据和其他凭据是合理的,因为它们在 数据敏感性、滥用可能造成的危害以及 法律和监管方面的考量上可能有所不同。
风险缓解和确保用户控制的一个关键组成部分, 且适用于这两类凭据,是用户 代理 检查凭据请求元数据并据此作出决定或进行 UI 呈现的能力。本规范通过协议要求确保用户 代理能够访问这些信息,这些要求规定请求应以 未加密形式传输并包含相关信息(参见5. 协议 和6.2 准备凭据请求)。
政府签发的 数字凭证包括旅行证件、个人许可证、 福利和公共卫生项目证明、车辆登记文件, 以及由政府机构签发的其他文件,或其他 表示此类信息的文件。这些文件高度 敏感,因为它们可能包含永久、不可撤销且唯一的 标识符,而这些标识符对于个人身份以及 与重要公共服务交互的能力至关重要。
这些凭证对用户和攻击者具有很高价值,这意味着 存在显著的盗窃风险,并且泄露给未经授权的第三方 可能造成重大伤害。这包括出于跟踪和 个性化目的请求政府身份信息。
政府凭证在线可用性提高所带来的一个主要担忧是 杰文斯悖论, 即由于访问阻力降低而增加凭证需求的可能性。 这种影响并非数字凭证 API 固有造成的,而是整个生态系统中数字凭证 日益广泛采用的结果,不过 用户 代理实现 数字凭证 API 很可能会进一步推动这一趋势。因此,这种影响需要由 实现该 API 的用户代理加以考虑,因为它可能 给用户带来有害后果:
上述政府签发数字凭证的风险构成了一项 无法由生态系统中的单一参与者解决的挑战, 需要各个主权国家内部就 使用现实世界凭证访问在线服务的风险和收益 开展更广泛的政策讨论。
最好由签发数字凭证的政府 同时制定法律法规,明确规定这些凭证可以如何使用以及 可用于哪些目的。参与交换的所有各方, 无论法律是否要求其这样做, 都建议支持任何政府验证者身份验证 方案(如果存在)。支持(并集成) 验证者身份验证方案,例如 EUDI 访问和注册证书,可以缓解 不必要凭证请求扩散的风险。然而, 并不能保证存在此类方案,这会显著 增加凭证交换的风险。
实现数字凭证 API 的用户 代理还可以采取其他实际措施来降低风险、增进用户 理解并防止某些类型的伤害:
此外,用户 代理设计能够考虑缺少这些缓解措施的许可 体验至关重要,例如,在没有任何验证者身份验证方案的情况下 交换政府凭证中的个人信息。建议 对这类交换施加 更高程度的操作阻力,并向用户提供明确消息突出 所涉及的风险。
非政府签发的凭证包括所有其他并非由 政府签发且不表示政府签发文件的数字 文档、证书和证明。 其中可能包括就业证明、(非政府)教育 凭证或电影票。值得注意的是,其交换可能 较少受到法律法规的限制。虽然这些文件通常 不具有与政府签发凭证相同的风险,但它们 也可能包含可识别身份或敏感的信息。
非政府凭证被盗和泄露的影响及可行性 在很大程度上取决于每种 凭证类型的内容。一般而言,这可能导致对 敏感私人信息失去控制并将其暴露,还可能导致 冒充和数据盗窃,从而增加 针对受影响个人进一步攻击的可能性。
非政府凭证的灵活性和缺乏监管 带来了被滥用于跨站跟踪 以及通过电子邮件地址或电话号码等长期存在的标识符关联身份的可能性。参与基于数字凭证的跟踪 方案的验证者可能会制造用户激励,使用户 在没有充分理解对其隐私影响的情况下, 接受在多个网站间共享标识符凭证(Web 的“会员 卡”)。
即使不愿在这种方案中共享信息的用户 也可能受到提示疲劳的影响,并可能面临被排除在 这些服务之外的风险。
对于非政府签发的凭证,建议 用户代理理解所请求的凭证 格式及其隐私属性,并建立风险框架,用于决定 向用户显示的上下文,以及 对每种凭证类型适当的操作阻力程度。参与此类凭证交换的协议和格式通常应 支持选择性披露和不可关联性等特性, 但这些特性不一定总是适合或必需, 尤其是在交换电影票等低风险 凭证时。
能够识别所请求凭证类型的用户代理 应根据所请求的凭证定制其许可体验, 并帮助用户理解共享该凭证的 后果。
不能期望用户代理理解所有 凭证请求。无法识别所请求凭证类型的用户代理应显著增加 许可体验中的用户操作阻力,并明确向用户传达 与网站共享未知凭证的风险。请注意, 这可能需要在 不同用户 代理之间进行集成,以施加 适当程度的阻力和透明度。例如, 浏览器可能会将有关凭证请求的知识委托给 操作系统,而操作系统可能要求凭证管理器 注册已知凭证类型,并拒绝未知凭证类型的 交换请求。
需要为用户提供适当透明度的需求,与 让生态系统无需获得用户代理明确认可即可开发新凭证 格式的愿望相冲突。
考虑为提出不必要和滥用性请求的验证者 建立可互操作的滥用报告系统。
虽然该 API 确保任何用户数据都不会在没有 许可提示的情况下共享(参见 [[[#user-permission-and-transparency|用户 许可和透明度]] 一节),但 数字凭证 API 可能返回的现实世界标识符具有长期性和唯一性, 使其成为跟踪器和 指纹识别者的潜在目标。
即使采用选择性披露,攻击者也可能组合 数字凭证中的数据(例如用户年龄、凭证 签发者、时间戳;参见 [[[#leaking-incidental-data|泄露 附带数据]] 一节)来重新识别和/或对用户进行指纹识别。
对于第三方攻击者(例如嵌入在 验证者页面上的脚本,但未为了跟踪目的与其主动 协作),这种攻击可能更困难,因为响应 加密是强制性的,并且响应应该在 验证者的服务器上解密。因此,验证者可以确保不 将解密后的信息反射回客户端 JavaScript。不过,并非所有 验证者都会选择这样做。
为确保凭据的真实性,将其出示给 验证者时,通常会包含比 验证者请求访问的内容更多的信息。它通常至少会 包含 签发者和凭据管理器的签名, 还可能包含其他元数据。
这些额外信息可能被用于重新识别用户和 对用户进行指纹识别,这在原本 不可关联的出示过程中尤其值得关注。
虽然 Digital Credentials API 不控制 凭据响应的内容,但用户代理可以通过明确突出显示 除所请求信息之外,哪些信息可能会与验证者共享, 并且更广泛地通过识别和阻止验证者利用该 API 进行指纹识别,来帮助保护用户免受此类跟踪。
Digital Credentials API 通过
userAgentAllowsProtocol()
公开有关出示和签发协议是否受
用户代理支持的信息。
它通过不根据例如
用户设备上安装了哪些凭据管理器应用程序
来定制其响应,从而缓解浏览器
指纹识别以及用户设备
配置信息的泄露。因此,返回的信息至多等同于一个
用户代理版本。
数字凭证 API 不允许网站在未先经过 用户许可 流程的情况下获知某个 凭证是否可用。 揭示凭证的存在会对用户 隐私造成风险,因为凭证的存在本身就是用户可能 不希望与网站共享的个人信息,而且与 其他信号结合后,可能在未经用户许可的情况下用于识别用户。 这也会对表达自由构成风险,因为 网站可能会越来越多地要求用户出示这些 凭证才能访问服务,从而排除 不愿出示凭证的个人。
为确保此保护措施足够稳健,API 返回的错误 不会通过可观察到的差异(例如不同的错误类型或时序 攻击)泄露有关用户可用凭据的信息。例如,当用户没有 匹配凭据时拒绝请求,与用户取消提示时拒绝 请求会返回相同的通用错误。此外,为了 在不依赖人为延迟的情况下防止时序攻击,用户 代理在未找到匹配凭据时会向用户显示一个对话框(例如空的选择器或 通知),从而使提示框被关闭的延迟 无法与用户取消操作区分开来。
Digital Credentials API 能够通过凭据与网站共享高度个人化、 敏感且存在风险的用户信息,并可能通过永久、唯一、不可撤销的跨上下文 标识符,使网站能够在线上 和线下跟踪用户。它还会向特定网站和/或 凭据管理器透露用户的部分浏览活动以及其表明身份的意图。在凭据请求中, 用户代理的一项关键职责是获得用户 继续进行信息交换的许可。
用户要就是否继续进行凭据交换 作出知情决定,需要了解的重要上下文详细信息包括 以下内容:
建议用户代理在实现中确保 在交换任何与用户相关的信息之前,将上述详细信息完整披露给 用户。
这些内容是否应该在规范中成为规范性要求?
API 是否应被设计为允许网站提供与上下文相关的 说明?
我们需要描述处理凭证出示的多个请求和响应时的 担忧、权衡以及可能的缓解措施。
根据用户系统的技术架构, “用户 代理”的定义很可能包括 软件栈中的多个协作层,例如浏览器 和操作系统。这些层最优先考虑的事项 必须是安全且信息充分的用户许可体验。因此, 集成对于用户安全可能至关重要。某些层可能持有 其他层无法访问的信息,例如 用户凭证的可用性。过度提示或在 缺少足够上下文的情况下提示可能导致(可被利用的)混淆和 提示麻木。
因此,提示许可的用户代理 应在认为这样做安全的前提下集成软件层, 以获得理想的用户体验。例如, 如果浏览器信任操作系统的 API 契约会显示 适当的提示,则可以不再自行显示提示。
作为用户许可流程的一部分,用户 代理需要 确保用户保留选择是否将 凭证请求转发给凭证管理器以及选择哪个凭证 管理器的权力。这是因为请求过程中会发生 信息披露,而且凭证 管理器在收到请求时能够保留或共享这些信息。
由用户 代理介导的许可并非同意, 同意具有特定的法律定义,这些定义在不同的法律 和监管环境中可能有所不同,并且在与 验证者共享信息之前,可能需要由 凭据管理器收集,或者由验证者本身在发起 请求之前收集。由于获取同意的框架和法规仍在 制定中,此 API 旨在支持交换 必要的信息,其中可能包括以下内容:
随着越来越多此类信息以结构化格式提供, 我们预计用户代理和本规范也将利用这些信息来 改善用户许可体验。
Digital Credentials API 本身不会引入新的 由浏览器管理的持久状态或本地存储机制。通过此 API 请求的凭据由外部凭据管理器或操作系统存储和管理。 因此,当用户清除给定源或全局的浏览数据(例如 Cookie 或本地存储)时,通常不会 清除或影响这些外部 管理器中保存的凭据。
用于选择和授权数字 凭证的用户界面由平台提供,并且在很大程度上超出了 本规范的范围;但是,该 体验的无障碍性属于本规范的范围(参见3. 范围)。以下指南 适用于实现数字凭证选择器、凭证管理器选择器及其相关流程的用户代理和平台, 并引用了 [WCAG22] 中相关的成功标准。如果任一选择器 是非 Web 用户界面,则这些 标准按照 [WCAG2ICT-22] 中的说明适用。
在签发或出示期间呈现的模态对话框内容(其中可以包括 文本、二维码和其他视觉媒体)应该具有标签,并以适当的名称、角色和值 向辅助技术公开 (参见§ 成功标准 4.1.2 名称、角色、值),并且应该为非文本内容提供文本 替代内容(参见§ 成功标准 1.1.1 非文本内容)。
交互状态的变化,例如等待另一 设备、成功响应、错误或取消,应该能够 以编程方式确定,并传达给辅助技术, 而无需改变焦点(参见§ 成功标准 4.1.3 状态消息)。
当操作失败时,用户代理会以若干不同错误之一
拒绝;例如,"NotAllowedError"、
"InvalidStateError" 或 "OperationError" DOMException,或
TypeError。如果平台将
此类失败呈现给用户,
则它应该以文本说明出了什么问题,并在适用时说明如何
恢复,而不是仅仅表示发生了错误(参见
§ 成功标准 3.3.1
错误识别)。
交互元素,尤其是允许用户 继续或中止签发 或出示请求的元素, 必须能够以与设备无关的方式操作(例如,通过 键盘;参见§ 成功标准 2.1.1 键盘)。特别是,激活不得要求将多点或基于路径的手势(参见 § 成功标准 2.5.1 指针手势)或设备运动(参见 § 成功标准 2.5.4 运动致动)作为唯一的操作方式。数字凭证选择器和凭证管理器选择器 应该以有意义的焦点顺序呈现其控件(参见 § 成功标准 2.4.3 焦点顺序),在选择器 打开时将焦点移入其中;在显示期间将焦点保持在其中;并在 关闭时将焦点恢复到 先前获得焦点的元素或其他适当位置。
如果释放数字凭证要求持有者进行 身份验证,则应该提供无障碍的身份验证方法。 如果某个步骤依赖认知功能测试,例如回忆 密码,则应该提供不需要此类测试的替代方式 (参见§ 成功 标准 3.3.8 无障碍身份验证(最低要求));并且 身份验证不应该仅依赖单一的身体 特征,例如某些用户无法提供的生物特征。 此步骤通常由平台或凭证管理器执行,在其他方面超出 本规范的范围。
某些平台会跨设备满足出示请求; 例如,显示二维码供用户使用 另一台设备扫描。由于此类流程可能依赖视觉、 摄像头或第二台设备的使用,因此平台应该提供一种 等效且无障碍的方式来完成交互,该方式 不依赖单一的感官能力或输入方式。仅通过二维码等 视觉制品传达的跨设备 请求,如果没有无障碍替代方式,会将无法使用该方式的用户排除在外。
一次交互可能受到来自多个来源的时间限制。 这些限制应该以不会将需要更多时间的用户 排除在外的方式处理(参见§ 成功标准 2.2.1 时间可调整):
AbortSignal作为
signal传入来限制交互;例如,
使用
AbortSignal.timeout() 创建的一个。站点应该留出足够的时间,并且不应该设置会使用户感到匆忙的短时限。
审查并披露数字凭证的决定不应该 受到强制倒计时的约束,包括从 周围站点流程继承的时间压力。
在交互期间显示的人类可读凭证内容,以及 为其提供的任何无障碍替代内容(例如图像的文本替代内容), 都承载在凭证载荷中,并由 相关的凭证格式和协议负责。这些 格式和协议还决定该内容的语言和书写方向。
本节为非规范性内容。
此 API 与凭证格式和交换协议无关,并且
将请求有效载荷(DigitalCredentialGetRequest 的
data 和
DigitalCredentialCreateRequest 的
data)以及响应有效载荷
(DigitalCredential 的data)视为不透明数据。因此,
该 API 未定义任何承载
人类可读自然语言内容的字符串类型值:
JSON.stringify 操作,而响应使用将 JSON 字符串解析为
JavaScript 值进行解析。由于 JSON.stringify 会将
孤立(未配对)的代理码点作为 \uXXXX 转义序列输出,因此
序列化后的请求始终是格式良好且可用 UTF-8 编码的 JSON。
因此,本规范未引入任何 需要语言或方向元数据的自然语言文本。如果未来修订版 在 API 层引入由网站编写的人类可读文本、 规范性定义的权限提示文本,或由用户代理绘制的 呈现元素,则这些文本需要携带或关联 适当的语言和方向元数据。
为了进行用户代理自动化和应用测试,本文档 为WebDriver BiDi 规范定义了扩展模块。用户代理 对这些模块的支持是可选的。
digitalCredentials 模块包含用于在
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
和[[Create]](origin, options, sameOriginWithAncestors)
调用期间管理和
模拟凭证管理器远端行为的命令。
CDDLdigitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"
digitalCredentials.SetVirtualWalletBehaviorParameters = {
action: digitalCredentials.VirtualWalletAction,
? context: text,
? protocol: text,
? response: { * text => any },
}
digitalCredentials.VirtualWalletAction
类型表示
不同类型的虚拟钱包操作。
"decline"
"respond"
"wait"
"clear"
CDDLdigitalCredentials.SetVirtualWalletBehavior = (
method: "digitalCredentials.setVirtualWalletBehavior",
params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
CDDLdigitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult
给定 session
和 command parameters,digitalCredentials.setVirtualWalletBehavior 命令的远端步骤如下:
action"]。
context"],
否则为
null。
protocol"],
否则为 null。
response"],
否则为 null。
"respond":
"clear":
null 的成功结果。
编写自动化测试的开发者可以通过
将AbortSignal作为signal
传入(用于
get()),
或将signal
传入(用于create()),
然后使用所需的中止原因将其
中止,从而模拟钱包错误。这会执行
请求算法使用的同一中止
路径。
(async () => {
const controller = new AbortController();
const credentialPromise = navigator.credentials.get({
digital: {
requests: [{
protocol: "example-request-protocol",
data: { /* 出示请求数据 */ }
}]
},
signal: controller.signal
});
controller.abort(
new DOMException("Simulated wallet failure", "OperationError")
);
try {
await credentialPromise;
} catch (error) {
console.assert(error.name === "OperationError");
}
})();
给定一个Promise
promise 和一个全局对象 global,要处理虚拟钱包行为,执行以下步骤:
false。
null,将 behavior 设置为当前 WebDriver
会话的默认活动虚拟钱包行为。
null,返回 false。
"wait",返回 true。
"decline":
NotAllowedError”
DOMException拒绝 promise。
true。
"respond":
action
§14.1.1
"clear"
§14.1.1
context
§14.1.1
[[Create]](origin, options, sameOriginWithAncestors)
DigitalCredential 的内部槽
§8.3
DigitalCredentialGetRequest
的成员
§7.3.2
DigitalCredentialCreateRequest
的成员
§7.6.2
DigitalCredential
的属性
§7.7.2
"decline"
§14.1.1
CredentialRequestOptions
的成员
§7.1.1
CredentialCreationOptions
的成员
§7.4.1
DigitalCredential 接口
§7.7
DigitalCredentialCreateRequest
字典
§7.6
DigitalCredentialCreationOptions
字典
§7.5
DigitalCredentialGetRequest 字典
§7.3
DigitalCredentialIssuanceProtocol
枚举
§7.8.3
DigitalCredentialPresentationProtocol
枚举
§7.8.2
DigitalCredentialProtocol
§7.7
DigitalCredentialRequestOptions
字典
§7.2
digitalCredentials.SetVirtualWalletBehavior
§14.1.2.1
"digitalCredentials.setVirtualWalletBehavior"
§14.1.2.1
digitalCredentials.SetVirtualWalletBehaviorParameters
§14.1.1
digitalCredentials.SetVirtualWalletBehaviorResult
§14.1.2.1
digitalCredentials.VirtualWalletAction
§14.1.1
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
DigitalCredential 的内部槽
§8.1
[[discovery]]
DigitalCredential 的内部槽
§8.5
method
§14.1.2.1
"openid4vci-v1"
DigitalCredentialIssuanceProtocol 的枚举值
§5.
"openid4vp-v1-multisigned"
DigitalCredentialPresentationProtocol 的枚举值
§5.
"openid4vp-v1-signed"
DigitalCredentialPresentationProtocol 的枚举值
§5.
"openid4vp-v1-unsigned"
DigitalCredentialPresentationProtocol 的枚举值
§5.
"org-iso-mdoc"
DigitalCredentialPresentationProtocol 的枚举值
§5.
params
§14.1.2.1
DigitalCredentialGetRequest
的成员
§7.3.1
DigitalCredentialCreateRequest
的成员
§7.6.1
DigitalCredential
的属性
§7.7.1
DigitalCredentialRequestOptions
的成员
§7.2.1
DigitalCredentialCreationOptions
的成员
§7.5.1
"respond"
§14.1.1
response
§14.1.1
[[Store]](credential, sameOriginWithAncestors)
DigitalCredential 的内部槽
§8.2
text
§14.1.1
[[type]] DigitalCredential 的内部槽
§8.4
userAgentAllowsProtocol()
DigitalCredential 的方法
§7.7.3
"wait"
§14.1.1
[[Create]](origin, options, sameOriginWithAncestors)
(用于 Credential)
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
(用于 Credential)
[[Store]](credential, sameOriginWithAncestors)(用于
Credential)
create()(用于
CredentialsContainer)
Credential 接口
CredentialCreationOptions
CredentialRequestOptions
CredentialsContainer 接口
get()(用于 CredentialsContainer)
mediation(用于
CredentialRequestOptions)
mediation(用于
CredentialCreationOptions)
Credential)
required(用于
CredentialMediationRequirement)
signal(用于
CredentialRequestOptions)
signal(用于
CredentialCreationOptions)
AbortSignal)
AbortSignal)
AbortSignal 接口
AbortSignal)
AbortSignal)
AbortController)
AbortController)
Document)
Document)
iframe
元素
object
类型
Window
接口
list)
iteration)
list)
list)
struct)
AbortError 异常
boolean
类型
exception)
[Default] 扩展属性
DOMException 接口
DOMString 接口
[Exposed] 扩展属性
InvalidStateError 异常
NotAllowedError 异常
object
类型
OperationError 异常
Promise 接口
ReferenceError 异常
[SameObject] 扩展属性
[SecureContext] 扩展属性
SecurityError 异常
exception)
TypeError 异常
WebIDLpartial dictionary CredentialRequestOptions {
DigitalCredentialRequestOptions digital;
};
dictionary DigitalCredentialRequestOptions {
required sequence<DigitalCredentialGetRequest> requests;
};
dictionary DigitalCredentialGetRequest {
required DOMString protocol;
required object data;
};
partial dictionary CredentialCreationOptions {
DigitalCredentialCreationOptions digital;
};
dictionary DigitalCredentialCreationOptions {
required sequence<DigitalCredentialCreateRequest> requests;
};
dictionary DigitalCredentialCreateRequest {
required DOMString protocol;
required object data;
};
typedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;
[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
[Default] object toJSON();
readonly attribute DigitalCredentialProtocol protocol;
[SameObject] readonly attribute object data;
static boolean userAgentAllowsProtocol(DOMString protocol);
};
enum DigitalCredentialPresentationProtocol {
"openid4vp-v1-unsigned",
"openid4vp-v1-signed",
"openid4vp-v1-multisigned",
"org-iso-mdoc"
};
enum DigitalCredentialIssuanceProtocol {
"openid4vci-v1",
};
digitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"
digitalCredentials.SetVirtualWalletBehaviorParameters = {
action: digitalCredentials.VirtualWalletAction,
? context: text,
? protocol: text,
? response: { * text => any },
}
digitalCredentials.SetVirtualWalletBehavior = (
method: "digitalCredentials.setVirtualWalletBehavior",
params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
digitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult
除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 可以、必须、不得 、可选、推荐、应该和不应该 应按照 BCP 14 [RFC2119] [RFC8174] 中所述的方式解释,并且仅在它们像此处所示那样全部 使用大写形式时如此解释。
部分编辑谨向以下个人表示感谢,感谢他们对 本规范提供的反馈和贡献:Christian Bormann (SPRIND)、John Bradley (Yubico)、Rick Byers (Google)、Brian Campbell (Ping Identity)、Lee Campbell (Google)、Nick Doty (CDT)、Heather Flanagan (Spherical Cow Consulting)、Ryan Galluzzo (NIST)、Joseph Heenan (Authlete)、Dominique Hazael-Massieux (W3C)、Bjorn Hjelm (Yubico)、Johann Hofmann (Google)、Mike Jones (Self-Issued Consulting)、Tobias Looker (MATTR)、Matthew Miller (Cisco)、Theresa O'Connor (Apple Inc.)、Simone Onofri (W3C)、Helen Qin (Google)、Wendy Seltzer(受邀 专家)、Manu Sporny (Digital Bazaar)、Orie Steele (Transmute)、Ted Thibodeau Jr (OpenLink Software)、David Waite (Ping Identity) 和 Kristina Yasuda (SPRIND)。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: