Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范描述了可验证凭证数据模型的一种扩展机制,该机制可用于通过 视觉、听觉或触觉媒介来表示可验证凭证。它涵盖了 将可验证凭证渲染到实体文档、数字图像、 屏幕阅读器或盲文输出。
本节描述本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
这是一份实验性规范,并且正在定期修订。它 不适合用于生产部署。
本文档由可验证凭证工作 组作为 工作草案发布,并使用 推荐标准轨道。
作为工作草案发布并不 意味着获得 W3C 及其成员的认可。
这是一份草案文档,可能随时被其他文档 更新、替换或废弃。除作为正在进行中的工作外, 不宜引用本文档。
本文档由一个根据 W3C 专利 政策运作的小组制作。 W3C 维护一个 任何专利披露的公开列表, 这些披露与该小组的交付物有关; 该页面还包含 披露专利的说明。任何实际 知悉某项专利并认为该专利包含 必要权利要求的个人, 必须根据 W3C 专利政策第 6 节披露相关信息。
本文档受 2025年8月18日 W3C 流程文档管辖。
当颁发者有特定方式, 想要通过视觉、听觉或触觉机制向观察者表达可验证凭证时, 可以使用渲染方法。例如,某个员工徽章凭证的颁发者可能希望包含 其企业徽标的丰富图像,并将员工信息具体放置在徽章的 特定区域。他们还可能希望为有与视力相关的 无障碍需求的个人提供该徽章重要方面的音频朗读。
以下术语用于描述本规范中的概念。
我们对凭证的定义不同于 NIST 对 凭证的定义。
did:example:123456abcdef。
verifiableCredential)相关联的图。这些属性
会产生独立的图,其中包含相应 JSON 对象中定义的所有声明。
除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释 均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED 和 SHOULD 应按 BCP 14 [RFC2119] [RFC8174] 中所述进行解释,且仅当它们像此处所示以全 大写形式出现时才如此解释。
一致的渲染方法是数据 模型的任何具体表达,只要它符合本规范中的规范性陈述。 具体而言,本文档第 2. 数据模型和第 2.2.4.2 算法 节中的所有相关规范性陈述MUST得到执行。
一致的处理器是任何以 软件和/或硬件实现、用于生成或消费 一致的渲染方法的算法。一致的处理器MUST在 消费不一致文档时产生错误。
本文档还包含一些含有 JSON 和 JSON-LD 内容的示例。其中
一些示例包含无效 JSON 字符,例如内联
注释(//)以及使用省略号(...)表示
对示例价值不大的信息。提醒实现者,
如果希望将这些信息用作有效 JSON 或
JSON-LD,应移除这些内容。
以下各节概述了本规范用于渲染方法的数据模型
renderMethod 属性是可验证凭证数据模型
规范 [VC-DATA-MODEL-2.0] 中的一个
保留扩展点。颁发者可以在
可验证凭证中使用此
属性,以表达一个或多个首选
渲染方法。
renderMethod 属性的值MUST指定一个或
多个渲染方法,软件可以使用这些方法通过视觉、听觉或
触觉机制来表达
可验证凭证。每个
renderMethod 值MUST指定其 type,例如
TemplateRenderMethod。每个渲染
提示的精确内容由具体的 renderMethod type
定义决定。
当颁发者希望为
可验证凭证指定基于模板的渲染指令时,他们MAY添加一个使用
以下所述数据模型的 renderMethod 属性。
| 属性 | 描述 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| id | 一个OPTIONAL的字符串,它遵循 URL 标准,并且在获取时, 会解引用到一个渲染模板。 | ||||||||
| type |
一个REQUIRED的字符串,其值MUST为
TemplateRenderMethod。
|
||||||||
| renderSuite | 一个REQUIRED的字符串,用于标识 生成具体渲染所使用的算法。 | ||||||||
| name | 一个OPTIONAL的、人类可读的字符串,可显示出来以提供 将要执行的渲染类型提示。此属性可用于 允许个人在多个呈示模式之间进行选择的 图形界面中。 | ||||||||
| description |
一个OPTIONAL的、人类可读的字符串,相比 name,
它提供了关于特定渲染何时可能有用的更详细
描述。
|
||||||||
| renderProperty |
一个OPTIONAL的列表,其中包含字符串值;每个值均符合
JavaScript 对象表示法(JSON)
Pointer语法,用于指定在使用此特定渲染方法时,
从可验证凭证中暴露哪些属性。如果
未提供 renderProperty,则在使用渲染方法时,假定会共享整个
可验证凭证。
|
||||||||
| template |
一个OPTIONAL的URL或映射,
它提供或引用
将用于执行渲染的模板。如果该值是URL,
则它MAY是包含模板
代码的 data: URL [RFC2397]。如果该值
是映射,则它MUST符合以下规则:
|
||||||||
| digestMultibase |
如果指定了 id,则这是所引用渲染方法的一个
OPTIONAL的、采用 multibase 编码的 Multihash。
multibase 值MUST为 u
(base64url-nopad),并且 multihash
值MUST为具有 256 位输出的 SHA-2(0x12)。
|
上面展示的数据模型在下面示例中的可验证凭证中表达。
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2",
"https://w3id.org/vc/render-method/v1"
],
"id": "http://example.edu/credentials/3732",
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"issuer": "https://example.edu/issuers/14",
"validFrom": "2010-01-01T19:23:24Z",
"credentialSubject": {
"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
},
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "svg-mustache",
"template": {
"id": "https://example.edu/credential-templates/BachelorDegree",
"mediaType": "image/svg+xml",
"digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR",
"renderProperty": [
"/issuer", "/validFrom", "/credentialSubject/degree/name"
]
}
}
}
在上面的示例中,颁发者为学士学位提供了一个基于 Mustache 的 SVG 渲染
模板,该模板将使用 renderProperty 中列出的
可验证凭证中的具体
信息进行填充。
svg-mustache 渲染套件使用 Mustache 模板语言
修改 SVG 文件,然后使用该文件来渲染
可验证凭证的视觉表示。
在下面的示例中,一个完全嵌入的 SVG 文件被用作渲染 模板。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "svg-mustache",
// SVG 文件嵌入在 VC 中
"template": "data:image/svg+xml;base64,Qjei89...3jZpW"
}
}
下一个示例链接到 Web 上的 SVG 文件,并通过使用
digestMultibase 属性保护它免遭修改。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "svg-mustache",
"template": {
// 此 SVG 文件从 Web 获取
"id": "https://degree.example/credential-templates/bachelors",
"mediaType": "image/svg+xml",
"digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
}
}
下一个示例链接到 Web 上的渲染模板,并使用
digestMultibase 属性保护它:
{
...
"renderMethod": {
// 此渲染方法从 Web 获取
"id": "https://degrees.example/bachelors-svg.jsonld",
"mediaType": "application/ld+json",
"type": "TemplateRenderMethod",
"renderSuite": "svg-mustache",
"digestMultibase": "zQmG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9znFCwYxAp"
}
pdf-mustache 渲染套件使用 Mustache 模板语言
修改 PDF 文件,然后使用该文件来渲染
可验证凭证的视觉表示。
在下面的示例中,一个完全嵌入的 PDF 文件被用作渲染 模板。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "pdf-mustache",
// 此 PDF 文件嵌入在 VC 中
"template": "data:application/pdf;base64,k309SK...pwK83b"
}
}
下一个示例链接到 Web 上的 PDF 文件,并通过使用
digestMultibase 属性保护它免遭
修改。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "pdf-mustache",
"template": {
// 此 PDF 文件从 Web 获取
"id": "https://degree.example/bachelors.pdf",
"mediaType": "application/pdf",
"digestMultibase": "zQmznFCwYxApG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9"
}
}
下一个示例链接到 Web 上的渲染模板,并使用
digestMultibase 属性保护它:
{
...
"renderMethod": {
// 此渲染方法从 Web 获取
"id": "https://degrees.example/bachelors-pdf.jsonld",
"type": "TemplateRenderMethod",
"renderSuite": "pdf-mustache",
"digestMultibase": "zQmEu5h6JqWAPdhyxmz2dRerWC85Wg6wFl9znFCwYxApG270"
}
nfc 渲染套件通过无线 NFC
连接传输表示
可验证凭证的二进制载荷。
在下面的示例中,一个完全嵌入的 NFC 载荷被用作渲染 模板,它只披露与该 凭证相关联的条形码标识符。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "nfc",
"name": "Tap to send",
// NFC 载荷被嵌入
"template": "data:application/octet-stream;base64,2QZkpQGDG...G8XJWnROcY4Biw",
// 仅通过 NFC 传输条形码
"renderProperty": ["/credentialSubject/barcode"]
}
...
}
html 渲染套件允许模板作者提供 HTML 模板
来渲染可验证凭证。HTML
可以作为 template 或
template.id(当 template 的值是对象时)的值,
通过远程方式引用,或通过 data: URL 引用。HTML 片段中的 JavaScript
负责渲染通过 HTML 数据块
(即 <script type="application/vc"></script>)提供的经过筛选的
可验证凭证数据,该数据块与 HTML 模板一起托管在
沙盒化 iframe 中。
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"type": [
"VerifiableCredential",
"NameCredential"
],
"issuer": {
"id": "did:example:1234",
"name": "The Issuer"
},
"credentialSubject": {
"name": "Example Name",
"notRendered": "should not appear"
},
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "html",
"renderProperty": [
"/issuer/name",
"/credentialSubject/name"
],
"template": {
"id": "https://test.example/credential-templates/NameCredential.html",
"mediaType": "text/html",
"digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
},
"outputPreference": {
"mode": [
"visual"
],
"mediaType": "application/html",
"style": {
"width": "800px",
"height": "800px"
}
}
}
}
实现MUST提供一种环境,使 JavaScript 能够 使用经过筛选的可验证凭证数据安全地渲染 HTML 模板。以下 术语用于描述此环境:
至少,该环境MUST阻止导航、外部 内容加载以及对宿主页面的访问,以防止跟踪和其他 隐私损害。
例如,基于浏览器的实现可以使用以下组合来提供此类环境:
对宿主页面施加内容安全策略 [CSP3] 限制、对托管
HTML 模板的 iframe 进行沙盒化,以及包装器
代码;该包装器代码包装 HTML 模板以添加额外的 CSP 限制,并
提供与宿主页面的 ready 和 error 事件通信。
宿主页面(通常是钱包或可验证凭证渲染器)MUST 阻止 HTML 模板导航顶级浏览上下文、 访问外部内容、访问宿主页面以及 加载任何远程 内容。
如果使用宿主页面,则适用以下规则:
frame-src 'none'。
这会强制 iframe 使用 srcdoc 而不是 src,
从而阻止
浏览器加载 HTML 模板。进而,这会迫使
宿主页面代码预加载远程引用的模板
代码,并在将模板注入包装器代码之前,
根据相关的 digestMultibase 值检查响应。
iframe 上MUST设置
sandbox="allow-scripts",
以防止导航和顶级访问。
<html>
<head>
<meta http-equiv="content-security-policy" content="frame-src 'none'">
</head>
<body>
<iframe id="renderer" sandbox="allow-scripts allow-modals" srcdoc=""></iframe>
</body>
</html>
由 renderMethod 中的
template 属性引用的 HTML 模板代码MUST是一个 HTML 片段,其中包含
渲染可验证凭证所必需的 HTML、CSS
和 JavaScript。该
模板代码MUST NOT
包含任何 <html>、<head> 或
<body> 标签,
因为这些将由包装器
代码提供。
<div>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
console.log('running template render script');
// 将凭证显示为 JSON,作为示例渲染器;这里也可以
// 改为执行任何其他操作,包括 mustache/其他风格的
// 模板处理,以生成用于显示的 HTML
// FIXME: 确定数据块/script 标签的最佳名称/位置
const credential = JSON.parse(document.querySelector(
'head > script[name="credential"]').innerHTML);
document.querySelector('#credentialSubject-name').innerText =
credential.credentialSubject.name;
document.querySelector('#issuer-name').innerText =
credential.issuer.name;
// TBD: 向宿主发出渲染完成信号
window.renderMethodReady();
});
</script>
<style>
h1 {
color: blue;
}
</style>
<h1 id="credentialSubject-name"></h1>
<p>颁发者:<span id="issuer-name"></span></p>
</div>
模板 HTML 片段MUST被包装在包装器代码中,
该包装器代码提供包含部分可验证凭证的数据块,
并添加额外的 CSP 策略,以阻止导航和外部
内容加载。具体而言,包装器
代码MUST添加以下 CSP
限制:default-src data: 'unsafe-inline',以阻止
模板
代码发出任何
网络请求。
<html>
<head>
<meta http-equiv="content-security-policy" content="default-src data: 'unsafe-inline'">
<script name="credential" type="application/vc">${JSON.stringify(credential)}</script>
</head>
<body>${template}</body>
</html>
为完成设置,宿主页面MUST将包装器
代码(在填入
可验证凭证
和模板代码后)注入 iframe 的
srcdoc
属性中,这将运行包装器
代码和模板代码中包含的任何 JavaScript。
<html>
<head>
<meta http-equiv="content-security-policy" content="default-src 'none' data: 'unsafe-inline'">
<!-- 注入到包装器代码中的凭证数据块。 -->
<script name="credential" type="application/vc">{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"type": [
"VerifiableCredential",
"NameCredential"
],
"issuer": {
"id": "did:example:1234",
"name": "The Issuer"
},
"credentialSubject": {
"name": "Example Name"
}
}</script>
<!-- 凭证数据块结束 -->
</head>
<body>
<!-- 注入到包装器代码中的模板 HTML。 -->
<div>
<script>
console.log('running template render script');
// 将凭证显示为 JSON,作为示例渲染器;这里也可以
// 改为执行任何其他操作,包括 mustache/其他风格的
// 模板处理,以生成用于显示的 HTML
// FIXME: 确定数据块/script 标签的最佳名称/位置
const credential = JSON.parse(document.querySelector(
'head > script[name="credential"]').innerHTML);
document.querySelector('#credentialSubject-name').innerText =
credential.credentialSubject.name;
document.querySelector('#issuer-name').innerText =
credential.issuer.name;
// TBD: 向宿主发出渲染完成信号
window.renderMethodReady()
</script>
<style>
h1 {
color: blue;
}
</style>
<h1 id="credentialSubject-name"></h1>
<p>颁发者:<span id="issuer-name"></span></p>
</div>
<!-- 模板 HTML 结束 -->
</body>
</html>
在包装器代码中创建的 iframe
MUST提供一个通信通道,
以允许模板在渲染完成时,或在
渲染期间发生错误时通知宿主页面。这可以使用
postMessage API 以及由包装器代码设置的
MessageChannel 来实现。
下面显示的 JavaScript 会添加到上述宿主页面中,
为 iframe 添加
onload 事件以设置 MessageChannel。该
宿主页面
还会创建一个 Promise,当从
包装器代码收到 ready 消息时解析,
或在收到 error
消息时拒绝。包装器代码
还提供一个 window.renderMethodReady 方法,供模板用来
通知宿主页面渲染完成或返回
错误消息。
// 一个 promise,在渲染准备就绪时解析(或在失败时拒绝);
// 可用于显示内容或错误
let resolveRender;
let rejectRender;
const readyPromise = new Promise((resolve, reject) => {
resolveRender = resolve;
rejectRender = reject;
});
// 设置通信通道,供 iframe 中的模板代码使用
renderer.onload = () => {
// 创建 MessageChannel;将一个端口传递给 iframe
const channel = new MessageChannel();
// 启动消息队列,以便 iframe 加载时消息不会丢失
channel.port1.start();
// 处理 `ready` 消息
channel.port1.onmessage = function ready(event) {
if(event.data === 'ready') {
// 取消隐藏 iframe,因为它已准备就绪
resolveRender();
} else {
rejectRender(new Error(event.data?.error?.message));
}
channel.port1.onmessage = undefined;
};
// 发送 "start" 消息;将 `port2` 发送给 iframe 用于返回通信
renderer.contentWindow.postMessage('start', '*', [channel.port2]);
};
// 设置对 ready 或 error 的事件响应
// NOTE: 本节取决于钱包/渲染器的 UX 需求
readyPromise.then(() => {
console.log('rendering ready');
const renderer = document.getElementById('renderer');
renderer.hidden = false;
}).catch(err => {
const errorMessage = document.getElementById('error-message');
errorMessage.style.display = 'block';
errorMessage.innerText = 'Rendering failed: ' + err.message;
console.error('rendering failed', err);
});
// 添加 promise,它将解析为来自
// 父窗口的通信端口
const portPromise = new Promise(resolve => {
window.addEventListener('message', function start(event) {
if(event.data === 'start' && event.ports?.[0]) {
window.removeEventListener('message', start);
resolve(event.ports[0]);
}
});
});
// 将一个函数附加到 window,供模板在
// “准备就绪”(或发生错误)时调用,该函数会向
// 父级发送消息,以便父级决定是否显示 iframe
window.renderMethodReady = function(err) {
portPromise.then(port => port.postMessage(
!err ? 'ready' : {error: {message: err.message}}));
};
通过此设置,模板 JavaScript 可以调用 window.renderMethodReady()
来通知宿主页面渲染完成,或者调用
window.renderMethodReady(new Error("error message")) 来通知宿主页面
发生错误。
以下各节概述了 html 渲染
套件用于安全渲染 HTML 模板的算法。只要安全和隐私结果以及输出相同,
MAY使用替代算法。
宿主页面MUST创建一个
iframe 元素来托管 HTML 模板。该
宿主页面MUST将
iframe 上的 sandbox 属性设置为
allow-scripts,以防止导航和顶级访问。
vc 为要渲染的可验证凭证。
renderMethod 为 vc 中选定的 renderMethod 属性,其中
renderMethod.type 是 TemplateRenderMethod,且
renderMethod.renderSuite 是 html。
renderMethod.template 是字符串,则令
template 为
renderMethod.template 的值。
renderMethod.template 是映射,则令
template 为
获取 renderMethod.template.id 中 URL 的结果。
如果存在 renderMethod.renderProperty,则宿主页面MUST筛选可验证凭证 vc,
使其仅包含 renderMethod.renderProperty 中指定的属性。如果
不存在 renderMethod.renderProperty,则使用整个可验证凭证。
此筛选MUST通过应用
Data Integrity ECDSA Cryptosuites v1.0 规范 [VC-DI-ECDSA]
第 3.4.13 节 selectJsonLd
中定义的 selectJsonLd 算法来完成,该算法应用于
renderMethod.renderProperty 中存在的 JSON Pointer [RFC6901] 值。
宿主页面MUST通过将经过筛选的 可验证凭证和 HTML 模板嵌入到上面定义的包装器代码模板中, 来创建包装器代码。
wrapperCode 为一个 HTML Document,其中在 <head> 中包含 <meta http-equiv="Content-Security-Policy"
content="default-src data: 'unsafe-inline'">。
datablock 为一个 type 为
application/vc 的 HTML 数据块。
datablock 的内容设置为字符串化 JSON 格式的
经过筛选的可验证
凭证。
datablock 插入
wrapperCode 的 <head> 中。
template 的值插入
wrapperCode 的 <body> 中。
宿主页面MUST将
iframe 的 srcdoc 属性
设置为生成的包装器代码。
iframe 的 srcdoc 属性设置为
wrapperCode 的字符串化 HTML。
宿主页面MUST与包装器代码建立
通信通道,以接收如上所述的 ready 和 error 消息。
renderPromise 为一个新的 Promise,它:
resolve 时,可用于向用户显示 iframe。
reject 时,向用户显示错误消息。
iframe 的 onload 事件中:
channel 为新的 MessageChannel。
channel 上创建并启动新的 port1 监听器,
该监听器监听来自现在已通过
wrapperCode 注入到 iframe 中的 template 代码的
ready 消息。
port1 监听器中,如果收到 ready 消息,
则解析 renderPromise。
如果收到 error 消息,则使用错误
消息拒绝 renderPromise。
postMessage 将 channel 的 port2
发送到 iframe 内容窗口。
宿主页面SHOULD使用
renderPromise 来确定渲染何时
完成,或渲染期间是否发生错误。
包装器代码MUST设置为
通过 MessageChannel 接收来自宿主页面的通信,并提供
window.renderMethodReady 方法,供
模板代码使用。
EmbeddedRenderer 由颁发者用于渲染可验证
凭证。可验证凭证通过文档中引用的 Template Renderer 网站,
在嵌入的
<iframe> 内以 HTML 形式渲染。这种安排允许使用
OpenAttestationMerkleProofSignature2018 进行交互式选择性披露。
Template Renderer 是嵌入在 iframe 中的 Web 应用程序。它基于 选定的模板渲染可验证凭证,并且必须监听来自 Host 应用程序的 特定消息,以便促进渲染 过程。
目前存在许多 EmbeddedRenderer 颁发者 和 embedded renderer 实现。
当颁发者希望为
可验证凭证指定嵌入式渲染指令时,他们MAY添加一个
使用以下所述数据模型的 renderMethod 属性。
| 属性 | 描述 |
|---|---|
| id | 一个 URL,用于定位实现 EmbeddedRenderer Action API 的网站。 |
| type | type 属性MUST为
EmbeddedRenderer。
|
| renderName |
由 id 指定的网站用于渲染
文档的模板名称。可以为 embedded
renderer 使用不同模板,以呈现可验证
凭证的不同 HTML 视图。
|
上面展示的数据模型在下面示例中的 可验证凭证中表达。
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/security/data-integrity/v2",
"https://trustvc.io/context/render-method-context-v2.json",
],
"credentialSubject": {
...
},
"type": ["VerifiableCredential"],
"issuer": "did:web:trustvc.github.io:did:1",
"validFrom": "2024-04-01T12:19:52Z",
"id": "urn:uuid:01992e54-cc5e-700e-a80b-60ddf0fffca9",
},
"renderMethod": [
{
"type": "EMBEDDED_RENDERER",
"templateName": "DEMO_CERTIFICATE",
"id": "https://generic-templates.tradetrust.io"
}
]
}
该可验证凭证指定了位于
https://generic-templates.tradetrust.io 的嵌入式渲染器,并使用名为
DEMO_CERTIFICATE 的模板。
embedded renderer 可以支持不同模板,以提供 可验证凭证的不同视图。下面是同一 可验证凭证使用不同模板的两种渲染效果。
Host 是借助 Template Renderer 显示文档的应用程序。Template Renderer
MUST是嵌入在由 renderMethod.id 指定的 iframe
中的 Web 应用程序。它MUST使用 postMessage API 与
Host 应用程序通信以执行操作。
所有操作都遵循相同结构。它们由 type 和
payload 组成:
type 表示正在执行的操作类型,例如
RENDER_DOCUMENT 表示渲染文档。操作的 type 是
必需的。
payload 表示与该 type 相关联的可选数据,例如
要渲染的文档内容。
一个开源参考实现可在 GitHub 上获得。
Host 与 Template Renderer 之间的交互如下图所示。
当 iframe 首次显示时,host 会向 iframe 发送命令 以渲染文档。支持的 4 种操作类型 如下所述。
| type | payload | 操作 |
|---|---|---|
GET_TEMPLATES |
|
获取 renderer 针对给定文档支持的模板列表。 模板列表由 iframe 中的 UPDATE_TEMPLATES 调用返回。 |
SELECT_TEMPLATE |
|
选择用于渲染的模板。它应来自 GET_TEMPLATES 返回的列表。如果未找到,则使用默认模板。 |
RENDER_DOCUMENT |
|
使用所选模板在 IFRAME 内渲染可验证凭证。 Document 是可验证凭证的 JSON 对象形式。 |
PRINT |
|
MUST显示打印对话框,以便可以 打印 IFRAME 的内容。 |
iframe 使用这些操作来更新 host,以便进行格式调整 或选择性遮盖。
| type | payload | 操作 |
|---|---|---|
OBFUSCATE |
|
这用于选择性遮盖。Host 会获知 已被混淆字段的路径,以便 host 可以 创建一个更新后的文档版本,其中所选字段 已被混淆。 |
UPDATE_HEIGHT |
|
以像素为单位通知 Host 嵌入式 iframe 的高度,以便 Host 可以在浏览器中调整大小。 |
UPDATE_TEMPLATES |
|
通知 Host 可从 RENDER_METHOD 或 GET_TEMPLATES 调用中使用的模板名称列表。 |
以下各节概述了本规范用于渲染方法的算法。
Mustache 模板语言用于 生成可验证凭证的视觉表示。 详见 Mustache 5.0 规范。
本节是非规范性的。
下面列出的安全注意事项需要转换为 各节:
本节是非规范性的。
下面列出的隐私注意事项需要转换为 各节:
id 来跟踪个人。这些
值应在客户端积极缓存,或使用
mixnet 或代理服务进行查找。
本节是非规范性的。
下面列出的国际化注意事项需要 转换为各节:
Referenced in:
Referenced in:
Referenced in:
Referenced in: