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による credentialの定義とは異なります。
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プロパティは、Verifiable Credentials Data Model
仕様 [VC-DATA-MODEL-2.0] における
予約済み拡張ポイントです。発行者は、
検証可能なクレデンシャルにおいてこの
プロパティを利用し、1つ以上の望ましいレンダリング方法を表現できます。
renderMethodプロパティの値は、視覚、聴覚、または触覚の仕組みを用いて
ソフトウェアが検証可能なクレデンシャルを表現するために
使用できる、1つ以上のレンダリング方法を指定しなければMUSTなりません。
各renderMethod値は、そのtype、たとえば
TemplateRenderMethodを指定しなければMUSTなりません。
各レンダリング・ヒントの正確な内容は、特定のrenderMethod
type定義によって決定されます。
発行者が、
検証可能なクレデンシャルに対して
テンプレートに基づくレンダリング指示を指定したい場合、その発行者は
以下で説明するデータモデルを使用するrenderMethodプロパティを追加してもよい
MAYです。
| プロパティ | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| id | URL Standardに従い、取得されると レンダリング・テンプレートに逆参照される、OPTIONALな 文字列。 | ||||||||
| type |
値がTemplateRenderMethodでなければMUSTならない、REQUIREDな
文字列。
|
||||||||
| renderSuite | 具体的なレンダリングの生成に使用されるアルゴリズムを識別する、 REQUIREDな文字列。 | ||||||||
| name | 実行されるレンダリングの種類に関するヒントを提供するために表示できる、 OPTIONALな人間可読の文字列。このプロパティは、 個人が複数の提示モードの中から選択できるグラフィカル・インターフェイスで 使用される場合があります。 | ||||||||
| description |
特定のレンダリングがどのような場合に有用であるかについて、nameよりも
詳しい説明を提供する、OPTIONALな人間可読の
文字列。
|
||||||||
| renderProperty |
この特定のレンダリング方法を使用する際に、検証可能なクレデンシャルから
どのプロパティが公開されるかを指定する、
JavaScript Object Notation (JSON)
Pointer構文にそれぞれ適合する文字列値の
OPTIONALなリスト。
renderPropertyが提供されない場合、レンダリング方法が使用される際には
検証可能なクレデンシャル全体が
共有されるものと推定されます。
|
||||||||
| template |
レンダリングを実行するために使用されるテンプレートを提供または参照する、
OPTIONALなURLまたはマップ。
値がURLである場合、
それはテンプレート・コードを含むdata: URL [RFC2397]
であってもよい
MAYです。値がマップである場合、それは
次の規則に適合しなければMUSTなりません。
|
||||||||
| digestMultibase |
idが指定されている場合に参照されるレンダリング方法の、
OPTIONALなmultibase符号化されたMultihash。
multibase値はu
(base64url-nopad)でなければならずMUST、
multihash値は256ビット出力のSHA-2(0x12)でなければ
MUSTなりません。
|
上記に示したデータモデルは、以下の例において 検証可能なクレデンシャルで 表現されています。
{
"@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"
]
}
}
}
上の例では、発行者が、renderPropertyに列挙された
検証可能なクレデンシャルからの
特定の情報で埋められる、学士号用のMustacheベースのSVGレンダリング・テンプレートを
提供しています。
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テンプレートと並んでサンドボックス化されたiframe内にホストされる
HTMLデータブロック
(すなわち<script type="application/vc"></script>)を介して提供される、
フィルタリング済みの検証可能なクレデンシャルデータを
レンダリングする役割を担います。
{
"@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"
}
}
}
}
実装は、フィルタリング済みの検証可能なクレデンシャルデータを用いて、 JavaScriptがHTMLテンプレートを安全にレンダリングできる環境を提供しなければ MUSTなりません。この環境を説明するために、次の用語が使用されます。
少なくとも、この環境は、追跡およびその他のプライバシー上の害を防止するために、 ナビゲーション、外部コンテンツの読み込み、およびホストページへのアクセスを 防止しなければMUSTなりません。
たとえばブラウザー・ベースの実装では、
ホストページ上のContent Security Policy [CSP3] 制限、
HTMLテンプレートをホストするiframeのサンドボックス化、および
HTMLテンプレートを包み込んで追加のCSP制限を加え、ホストページとの
readyおよびerrorイベント通信を提供するラッパーコードを組み合わせることで、
そのような環境を提供できます。
ホストページ(通常はウォレットまたは 検証可能なクレデンシャルレンダラー)は、 HTMLテンプレートがトップレベル閲覧コンテキストをナビゲートすること、 外部コンテンツにアクセスすること、ホストページに アクセスすること、および任意のリモートコンテンツを読み込むことを 防止しなければMUSTなりません。
ホストページが使用される場合、次の規則が適用されます。
frame-src 'none'を含めなければMUSTなりません。
これにより、iframeではsrcではなくsrcdocの使用が強制され、
ブラウザーがHTMLテンプレートを読み込むことを防ぎます。その結果、
ホストページのコードは、リモートで参照されるテンプレートコードを
事前に読み込み、テンプレートをラッパーコードに注入する前に、
関連するdigestMultibase値に対して応答を確認する必要があります。
iframeには、
ナビゲーションとトップレベルアクセスを防止するために
sandbox="allow-scripts"を設定しなければ
MUSTなりません。
<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テンプレートコードは、
検証可能なクレデンシャルをレンダリングするために必要な
HTML、CSS、およびJavaScriptを含むHTMLフラグメントでなければ
MUSTなりません。
テンプレートコードは、
<html>、<head>、または
<body>タグを含めてはならずMUST NOT、
これらはラッパー
コードによって提供されます。
<div>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
console.log('running template render script');
// credentialをJSONとして表示するレンダラー例。代わりに、
// mustache/その他の形式のテンプレート処理など、表示用HTMLを
// 生成する任意の処理をここで実行できる
// FIXME: datablock/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フラグメントは、部分的な検証可能なクレデンシャルを含むデータブロックを
提供し、ナビゲーションおよび外部コンテンツ読み込みを防止する追加のCSPポリシーを加える
ラッパーコードで包み込まれなければ
MUSTなりません。具体的には、
ラッパー
コードは、テンプレート
コードによってネットワーク要求が行われることを防ぐために、
default-src data: 'unsafe-inline'というCSP制限を追加しなければ
MUSTなりません。
<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>
セットアップを完了するために、ホストページは、
(検証可能なクレデンシャルおよび
テンプレートコードが設定された)
ラッパー
コードをiframeのsrcdoc属性に注入しなければ
MUSTなりません。これにより、
ラッパー
コードおよびテンプレートコードに含まれる
JavaScriptが実行されます。
<html>
<head>
<meta http-equiv="content-security-policy" content="default-src 'none' data: 'unsafe-inline'">
<!-- ラッパーコードに注入されるcredentialデータブロック。 -->
<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>
<!-- credentialデータブロック終わり -->
</head>
<body>
<!-- ラッパーコードに注入されるテンプレートHTML。 -->
<div>
<script>
console.log('running template render script');
// credentialをJSONとして表示するレンダラー例。代わりに、
// mustache/その他の形式のテンプレート処理など、表示用HTMLを
// 生成する任意の処理をここで実行できる
// FIXME: datablock/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なりません。これは、
ラッパーコードによって設定される
MessageChannelとpostMessage APIを使用して実現できます。
以下に示すJavaScriptは、上記のホストページに追加され、
MessageChannelを設定するiframeのonloadイベントを追加します。
ホストページはまた、
ラッパーコードからreadyメッセージを受信したときに
解決し、errorメッセージを受信したときに拒否する
Promiseを作成します。ラッパーコードはまた、
テンプレートがレンダリング完了をホストページへ通知したり、エラーメッセージを送り返したり
するために使用するwindow.renderMethodReadyメソッドを提供します。
// レンダリングがreadyになったときに解決する(失敗した場合は拒否する)promise。
// 表示やエラー表示に使用できる
let resolveRender;
let rejectRender;
const readyPromise = new Promise((resolve, reject) => {
resolveRender = resolve;
rejectRender = reject;
});
// iframe内のテンプレートコードで使用する通信チャネルを設定する
renderer.onload = () => {
// MessageChannelを作成し、1つのportをiframeへ転送する
const channel = new MessageChannel();
// iframeの読み込み中にメッセージが失われないよう、メッセージキューを開始する
channel.port1.start();
// `ready`メッセージを処理する
channel.port1.onmessage = function ready(event) {
if(event.data === 'ready') {
// 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);
});
// 親ウィンドウから通信portへ解決される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]);
}
});
});
// テンプレートが「ready」になった(またはエラーが発生した)ときに呼び出す
// 関数を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です。
ホストページは、HTMLテンプレートをホストする
iframe要素を作成しなければMUSTなりません。
ホストページは、ナビゲーションおよびトップレベルアクセスを
防止するために、iframeのsandbox属性を
allow-scriptsに設定しなければMUSTなりません。
vcを、レンダリングされる検証可能なクレデンシャルとする。
renderMethodを、vc内で選択された
renderMethodプロパティであり、
renderMethod.typeがTemplateRenderMethod、
renderMethod.renderSuiteがhtmlであるものとする。
renderMethod.templateが文字列である場合、
templateを
renderMethod.templateの値とする。
renderMethod.templateがマップである場合、
templateを
renderMethod.template.id内のURLを取得した結果とする。
ホストページは、renderMethod.renderPropertyが
存在する場合、検証可能なクレデンシャルvcを
renderMethod.renderPropertyで指定されたプロパティのみを含むように
フィルタリングしなければMUSTなりません。
renderMethod.renderPropertyが存在しない場合、
検証可能なクレデンシャル全体が
使用されます。
このフィルタリングは、renderMethod.renderPropertyに存在する
JSON Pointer [RFC6901] 値に対し、
Data Integrity ECDSA Cryptosuites v1.0仕様 [VC-DI-ECDSA] の
セクション3.4.13 selectJsonLd
で定義されたselectJsonLdアルゴリズムを適用することによって
行われなければMUSTなりません。
ホストページは、フィルタリング済みの 検証可能なクレデンシャルおよびHTMLテンプレートを、 上で定義されたラッパーコードテンプレートに 埋め込むことで、ラッパーコードを作成しなければ MUSTなりません。
wrapperCodeを、<head>内に
<meta http-equiv="Content-Security-Policy"
content="default-src data: 'unsafe-inline'">を持つHTML Documentとする。
datablockを、typeが
application/vcであるHTML Data Blockとする。
datablockの内容を、フィルタリング済みの検証可能な
クレデンシャルをJSON文字列化した形式に設定する。
datablockをwrapperCodeの<head>に
挿入する。
templateの値をwrapperCodeの<body>に
挿入する。
ホストページは、iframeの
srcdoc属性を、生成されたラッパーコードに
設定しなければMUSTなりません。
iframeのsrcdoc属性を、
wrapperCodeを文字列化したHTMLに設定する。
ホストページは、上記の説明のとおり
readyおよびerrorメッセージを受信するために、
ラッパーコードとの通信チャネルを
設定しなければMUSTなりません。
renderPromiseを、次の性質を持つ新しいPromiseとする。
resolve時には、iframeをユーザーに表示するために
使用できる。
reject時には、ユーザーにエラーメッセージを表示する。
iframeのonloadイベントにおいて:
channelを新しいMessageChannelとする。
channel上に、wrapperCode経由で
iframeへ注入されたtemplate内のコードからの
readyメッセージを待ち受ける、新しいport1
リスナーを作成して開始する。
port1リスナーにおいて、readyメッセージを受信した場合は
renderPromiseを解決する。
errorメッセージを受信した場合は、エラーメッセージで
renderPromiseを拒否する。
postMessageを使用して、channelのport2を
iframeのcontent windowへ送信する。
ホストページは、レンダリングが完了した時点、または
レンダリング中にエラーが発生したかどうかを判断するために、
renderPromiseを使用するべきSHOULDです。
ラッパーコードは、
MessageChannelを介してホストページからの通信を
受信するように設定し、テンプレートコードで使用する
window.renderMethodReadyメソッドを提供しなければ
MUSTなりません。
EmbeddedRendererは、発行者が検証可能なクレデンシャルをレンダリングするために使用されます。
検証可能なクレデンシャルは、文書内で参照されるTemplate Renderer Webサイトを通じて、
埋め込まれた<iframe>内のHTMLとしてレンダリングされます。
この構成により、OpenAttestationMerkleProofSignature2018を使用した
対話的な選択的開示が可能になります。
Template Rendererは、iframe内に埋め込まれるWebアプリケーションです。これは、 選択されたテンプレートに基づいて検証可能なクレデンシャルをレンダリングし、 レンダリング処理を促進するためにHostアプリケーションからの特定のメッセージを 待ち受けなければなりません。
現在、多数のEmbeddedRenderer発行者および埋め込みレンダラー実装が存在します。
発行者が、
検証可能なクレデンシャルに対して
埋め込みレンダリング指示を指定したい場合、その発行者は以下で説明するデータモデルを
使用するrenderMethodプロパティを追加してもよい
MAYです。
| プロパティ | 説明 |
|---|---|
| id | EmbeddedRenderer Action APIを実装するWebサイトを指すURL。 |
| type | typeプロパティは
EmbeddedRendererでなければMUST
なりません。
|
| renderName |
文書をレンダリングするために、idで指定されたWebサイトによって使用される
テンプレートの名前。埋め込みレンダラーが検証可能なクレデンシャルの異なる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"
}
]
}
検証可能なクレデンシャルは、
DEMO_CERTIFICATEという名前のテンプレートを使用する埋め込みレンダラーを
https://generic-templates.tradetrust.ioで指定します。
埋め込みレンダラーは、検証可能なクレデンシャルの異なるビューを提供できる さまざまなテンプレートをサポートできます。以下は、異なるテンプレートを使用した 同一の検証可能なクレデンシャルの2つのレンダリングです。
Hostは、Template Rendererの助けを借りて文書を表示するアプリケーションです。
Template Rendererは、renderMethod.idで指定されるiframe内に
埋め込まれたWebアプリケーションでなければMUSTならず、
アクションを実行するためにpostMessage APIを用いてHostアプリケーションと通信しなければ
MUSTなりません。
すべてのアクションは同じ構造に従います。これらはtypeと
payloadで構成されます。
typeは、実行されるアクションの種類を示します。たとえば、
RENDER_DOCUMENTは文書をレンダリングすることを意味します。アクションのtypeは
必須です。
payloadは、typeに関連付けられた任意のデータ、たとえば
レンダリングする文書の内容を示します。
オープンソースの参照実装は GitHubで入手できます。
HostとTemplate Rendererの相互作用は、以下の図に示されています。
iframeが最初に表示されると、hostは文書をレンダリングするためのコマンドをiframeへ 送信します。サポートされる4種類のアクションを以下に説明します。
| type | payload | アクション |
|---|---|---|
GET_TEMPLATES |
|
指定された文書についてレンダラーがサポートするテンプレートの一覧を取得します。 テンプレートの一覧は、iframeからのUPDATE_TEMPLATES呼び出しによって返されます。 |
SELECT_TEMPLATE |
|
レンダリングに使用するテンプレートを選択します。GET_TEMPLATESによって返された 一覧に含まれているべきです。見つからない場合は、デフォルトのテンプレートが 使用されます。 |
RENDER_DOCUMENT |
|
選択されたテンプレートを使用して、IFRAME内で検証可能なクレデンシャルを レンダリングします。Documentは、検証可能なクレデンシャルのJSONオブジェクト形式です。 |
PRINT |
|
IFRAMEの内容を印刷できるように、印刷ダイアログを表示しなければ MUSTなりません。 |
これらはiframeによって、整形または選択的な墨消しの調整を行うためにhostを更新する目的で 使用されます。
| type | payload | アクション |
|---|---|---|
OBFUSCATE |
|
これは選択的な墨消しに使用されます。Hostには難読化されたフィールドのパスが通知され、 hostは選択されたフィールドを難読化した文書の更新版を作成できます。 |
UPDATE_HEIGHT |
|
埋め込みiframeの高さをピクセル単位でHostへ通知し、Hostがブラウザー上で サイズを調整できるようにします。 |
UPDATE_TEMPLATES |
|
RENDER_METHODまたはGET_TEMPLATES呼び出しから使用可能なテンプレート名の一覧を Hostへ通知します。 |
以下のセクションでは、本仕様でレンダリング方法のために使用される アルゴリズムの概要を示します。
Mustacheテンプレート言語は、 検証可能なクレデンシャルの視覚的表現を 生成するために使用されます。 詳細については、Mustache 5.0 仕様を参照してください。
このセクションは非規範的です。
以下に列挙されているセキュリティに関する考慮事項の一覧は、 セクションに変換する必要があります。
このセクションは非規範的です。
以下に列挙されているプライバシーに関する考慮事項の一覧は、 セクションに変換する必要があります。
idを使用する可能性があります。
これらの値は、クライアント側で積極的にキャッシュするか、mixnetまたは
プロキシサービスを使用して検索するべきです。
このセクションは非規範的です。
以下に列挙されている国際化に関する考慮事項の一覧は、 セクションに変換する必要があります。
Referenced in:
Referenced in:
Referenced in:
Referenced in: