VCALM v1.0

ライフサイクル管理のための検証可能なクレデンシャル API

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-vcalm-1.0-20260630/
最新公開バージョン:
https://www.w3.org/TR/vcalm-1.0/
最新の編集者草案:
https://w3c.github.io/vcalm/
履歴:
https://www.w3.org/standards/history/vcalm-1.0/
コミット履歴
編集者:
Patrick St. Louis (Open Security and Identity)
Kayode Ezike (Gobekli)
Manu Sporny (Digital Bazaar)
Ted Thibodeau Jr (OpenLink Software)
著者:
Dave Longley (Digital Bazaar)
Joe Andrieu (Legendary Requirements)
Markus Sabadello (Danube Tech)
Kayode Ezike (Gobekli)
Nate Otto (Skybridge Skills)
Eric Schuh (Legendary Requirements)
Patrick St. Louis (Open Security and Identity)
フィードバック:
GitHub w3c/vcalm (プルリクエスト, 新しい課題, 未解決の課題)
public-vc-wg@w3.org へ、件名行は [vcalm-1.0] … メッセージのトピック … としてください (アーカイブ)
会議:
次に予定されている 会議を表示

概要

検証可能なクレデンシャルは、暗号学的に安全で、プライバシーを尊重し、 機械で検証可能な方法で、Web 上にクレデンシャルを表現する仕組みを提供します。 この仕様は、そのようなエコシステムで使用されるデータを発行、検証、提示、管理するための データモデルと HTTP プロトコルを提供します。

この文書のステータス

この節では、この文書の公開時点におけるステータスについて説明します。 現在の W3C 公開文書の一覧と、この技術報告書の最新改訂版は、 W3C 標準および草案 インデックスで確認できます。

この仕様は活発に開発されています。この仕様に関する活動を調整する 週次会議に参加していない限り、本番システムへの導入は推奨されません。

この文書は、検証可能なクレデンシャル・ワーキング グループによって、 勧告 トラックを使用する作業草案として公開されました。

作業草案としての公開は、 W3C およびそのメンバーによる 承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を作業中のもの以外として引用することは不適切です。

この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成されました。 W3C は、 グループの成果物に関連して行われた特許開示の公開一覧 を維持しています。そのページには、特許を開示するための手順も含まれています。 個人が、当該個人の考えでは 必須請求項 を含む特許について実際の知識を有する場合、その情報を W3C 特許ポリシー第 6 節に従って 開示しなければなりません。

この文書は、 2025年8月18日版 W3C プロセス文書に準拠します。

1. はじめに

この節は非規範的です。

Verifiable Credentials 仕様 [VC-DATA-MODEL-2.0] は、 暗号学的に安全で、プライバシーを尊重し、機械で検証可能な方法でデジタル・クレデンシャルを表現するための データモデルとシリアライゼーションを提供します。この仕様は、検証可能なクレデンシャルの発行、 検証、提示、および管理のための HTTP アプリケーション・プログラミング・インターフェイス (HTTP API) とプロトコルのセットを提供します。

検証可能なクレデンシャルを管理する場合、 想定される API には、大きく分けて 2 つの種類があります。 1 つ目の種類の API は、単一のセキュリティ・ドメイン内で使用されるように設計されています。 2 つ目の種類の API は、異なるセキュリティ・ドメイン間で通信するために使用できます。 この仕様は、この両方の種類の API を定義します。

単一のセキュリティ・ドメイン内で使用されるように設計された API は、 発行者検証者、 または保持者など、 単一の役割の代理として動作するシステムによって使用されます。 検証可能なクレデンシャルのエコシステムにおけるこれらの API の利点の 1 つは、 検証可能なクレデンシャルを管理するための有用で、共通で、吟味済みのモジュール式アーキテクチャを定義することです。 たとえば、このアプローチは、ソフトウェア・アーキテクトが共通コンポーネントと統合し、 検証可能なクレデンシャルを発行するシステムを実装する際に 共通の言語でやり取りするのに役立ちます。 特定のアーキテクチャが吟味済みであることを知ることは、 検証可能なクレデンシャルを専門としないアーキテクトにとっても有益です。 文書化されたアーキテクチャと API は、市場競争を高め、ベンダー・ロックインと切り替えコストを低減します。

複数のセキュリティ・ドメインにまたがって動作するように設計された API は、 検証可能な クレデンシャルのやり取りにおいて、2 つの異なる役割の間で通信するシステムによって使用されます。 たとえば、保持者検証者の間で提示を通信するために使用される API です。 検証可能なクレデンシャルのやり取りにおける プロトコル相互運用性を実現するためには、これらの API を標準化することが不可欠です。 これらの API を文書化する追加の利点は、単一セキュリティ・ドメイン API を文書化する場合と同じです。 すなわち、共通で吟味済みのアーキテクチャと API、市場競争の向上、 およびベンダー・ロックインと切り替えコストの低減です。

この仕様には、ソフトウェア・アーキテクトおよび実装者が有用と感じる可能性のある 以下の節が含まれています。

1.1 設計目標と根拠

この節は非規範的です。

Verifiable Credentials API は、以下の設計目標に向けて最適化されています。

目標 説明
モジュール性 実装者は、ユースケースに必要な API のみを実装すればよく、 発行、検証、提示の間でモジュール性を実現できます。
単純性 API の数と任意性は最小限に抑えられており、セキュリティの観点から 実装および監査しやすいものになっています。
組み合わせ可能性 API は組み合わせ可能になるよう設計されており、少数の単純な API プリミティブを使用して 複雑なフローを実現できます。
拡張性 API エンドポイントへの拡張は想定されており、API 設計で対応されています。 これにより、基盤 API プラットフォーム上での実験や付加価値サービスの追加が可能になります。

HTTP API 設計ガイドライン

この仕様の基礎として、RESTful API アプローチが使用されました。 一部のエンドポイントでは、「コントローラー」リソース命名スタイルと呼ばれるものを使用します。 JSON 文書を記述するためのメディア型である JSON Schema は、API への受け入れ可能な入力を定義するために使用されます。

1.2 アーキテクチャの概要

この節は非規範的です。

Verifiable Credentials Data Model は、3 つの基本的な役割、 発行者検証者、および 保持者を定義します。


発行者、保持者、検証者という検証可能なクレデンシャルの役割を示す図
1 Verifiable Credentials Data Model 仕様によって定義される役割。

これらの各役割を果たすアクターは、検証可能なクレデンシャルを交換するための API を実現するために、 多数のソフトウェアまたはサービス・コンポーネントを使用する場合があります。

各役割は、役割固有のコーディネーター、サービス、および管理に加えて、 それぞれ専用のストレージ・サービスに関連付けられます。さらに、発行者は、発行者が発行した取消可能なクレデンシャルのための ステータス・サービスも管理できます。

発行者、検証者、保持者のためのコーディネーター、サービス、管理の API コンポーネント
2 API コンポーネント。矢印はフローの開始を示します。

任意の実装は、これらのコンポーネントの一部または全部を単一の機能的なアプリケーションに 結合することを選択できます。これらのコンポーネント間の境界とインターフェイスは、 検証可能なクレデンシャルに適合したエコシステム全体での相互運用性と代替可能性を確保するために、 この仕様で定義されます。

課題 1: アーキテクチャの標準化が最重要であり、コンポーネント標準は二次的である

このアーキテクチャ的な考え方に基づくと、この API を、関連仕様のロードマップとして、 最大限の代替可能性を得るために拡張可能な方法で統合されたものとして位置付けたい場合があります。 EDV や WebKMS など、いくつかの技術は、検証可能な クレデンシャルの証明で採用されている暗号スイート・アプローチの恩恵を受ける可能性があります。 機能的に適合する任意の技術によって実現可能な汎用メカニズムを定義することで、 現在存在する機能を土台にしながら柔軟性を実現できます。このようにして、キー・サービス、 ストレージ、ステータスなどの要素がこの API の必要な部分であることを認めつつ、 それらの要素がどのように機能するかの定義を、すでに開発中の仕様や これから作成される仕様に委ねることができるかもしれません。

コンポーネントを単一のアプリに集約することに加えて、実装者は、配備されたソフトウェアの 任意の数のアクティブなインスタンス上で、任意の役割を運用することを選択できます。 たとえば、ブラウザー・ベースの保持者 コーディネーターは、Web ブラウザー、そのブラウザー内で実行されるさまざまなコード、 1 つ以上の Web サーバー(クロスオリジン AJAX またはリモート埋め込みコンテンツの場合)、 およびそのサーバー上で実行されるコードの集合体と見なされるべきです。 これらの要素はそれぞれ、異なる構成の異なるソフトウェア・パッケージとして実行され、 コンポーネント全体の機能の一部だけを実行します。この API においては、 配備アーキテクチャに関係なく、各コンポーネントはその必要な機能を全体として満たします。

1.3 適合性

非規範的と明示された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様内のそれ以外のすべては規範的です。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONALRECOMMENDEDREQUIREDSHOULD、および SHOULD NOT は、ここで示されているようにすべて大文字で出現する場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。

適合する発行者サービス実装は、Section 3.2.1 クレデンシャルの発行で説明されるインターフェイスを MUST 提供します。Section 3.2 発行で説明されるその他のインターフェイスも MAY 提供されます。

適合する検証者サービス実装は、 Section 3.3.1 クレデンシャルの検証および Section 3.3.2 提示の検証で説明されるインターフェイスを MUST 提供します。Section 3.3 検証で説明されるその他のインターフェイスも MAY 提供されます。

適合する保持者サービス実装は、 Section 3.6.4 交換プロトコルの取得および Section 3.6.5 交換への参加で説明されるインターフェイスを MUST 提供します。Section 3.7 インタラクションの開始、Section 3.4 提示の要求、Section 3.5.2 提示の作成、Section 3.5 提示、および Section 3.6 ワークフローと交換で説明されるプロトコル、クエリ言語、 およびデータ形式への適合も MAY 提供されます。

適合するステータス・サービス実装は、 Section C.3 ステータスの更新で説明されるインターフェイスを MUST 提供します。

適合するワークフロー・サービス実装は、 Section 3.6 ワークフローと交換のすべてのインターフェイスを MUST 提供します。

適合するサービス・クライアント実装は、対応するサービス実装によって提供される すべての REQUIRED インターフェイスと通信する手段を MUST 提供します。すなわち、 ステータス・クライアント実装は、 ステータス・サービス実装によって公開される すべての必須インターフェイスと通信する手段を提供します。

すべての実装は、この仕様を超える機能を MAY 提供します。

1.4 用語

この節は非規範的です。

この文書全体で使用される用語は、 Verifiable Credentials Data Model v2.0 仕様の 用語の節で定義されています。

2. アーキテクチャ

これらのソフトウェア・コンポーネントの考えられるアーキテクチャの 1 つは、 以下のアーキテクチャ記述、および 1.2 アーキテクチャの概要の節の図によって表されます。これらの表現は、 仕様内のさまざまな機能の分類を明確にし、各コンポーネントを読解の明確さのためにも、 また各コンポーネントが他の任意のコンポーネントから独立して実装できることを強調するためにも、 個別に扱えるようにするために選ばれました。ただし、これは規範的なアーキテクチャではありません。 実装者は、望むだけ多くまたは少ないソフトウェア・パッケージを使用して複数の役割を果たすことができます。 役割は単一のライブラリまたはその他のソフトウェア・パッケージによって提供される必要はなく、 ソフトウェア・ライブラリまたはパッケージが特定の役割を他の役割から分離して提供する必要もありません。 また、単一のソフトウェアまたはシステム・コンポーネントの配備が、特定のユースケースで必要に応じて 複数の役割を目的とすることも期待されています。

2.1 コーディネーター

コーディネーターは、関連付けられた役割によって設定された ビジネスルールとポリシーを実行します。多くの場合、これはその役割を担う単一の当事者のために 特別に開発されたカスタムまたはプロプライエタリなコーディネーターであり、 管理主体を検証可能なクレデンシャル エコシステムに接続する統合の接着剤です。

コーディネーターは、実装によっては視覚的なユーザー・インターフェイスを 提供する場合があります。純粋なコマンドラインまたは継続的に実行されるサービスでも、 このコンポーネントを実現できる場合があります。

ステータス・サービスを例外として、 すべての役割間通信は、特定のアクターの代理としてその役割を果たす コーディネーター間で行われます。

発行者コーディネーターは、 誰がどのクレデンシャルを取得するかに関するルールを実行します。これには、 それらのクレデンシャルを作成または受信する当事者がどのように認証および認可されるかも含まれます。 通常、発行者 コーディネーターは、 発行者のバックエンド・システムを 発行者サービスと統合します。 この統合では適切な任意の技術を使用します。発行者コーディネーターとバックエンド・サービスの間のインターフェイスは、 この仕様の範囲外です。発行者コーディネーターは、発行者サービスを駆動します。

検証者 コーディネーターは、検証者 サービスと通信し、 まず特定の検証可能なクレデンシャル または 検証可能な 提示の真正性と適時性を確認し、その後、最終的にその検証可能なクレデンシャル または 検証可能な 提示を受け入れるか拒否する前に、検証者のビジネスルールを適用します。 そのようなビジネスルールには、特定の主張の 発行者を評価すること、 または単に設定済みの許可リストを確認することが含まれる場合があります。 検証者コーディネーターは、検証可能なクレデンシャル検証者のポリシーに従って 検証者へ提出する API を公開します。 たとえば、検証者コーディネーターは、検証可能なクレデンシャル検証者の他のサービスの 現在のユーザーからのみ受け入れる場合があります。これらのルールは通常、 検証者の既存のバックエンドとの 個別の統合を必要とします。

保持者 コーディネーターは、保持者の管理下にあるクレデンシャルの流れを承認するための ビジネスルールを実行します。これは、発行者から 検証者へ至る流れです。 一部の配備では、これは個々の保持者に、 検証可能なクレデンシャルの 保管または転送を認可または承認する視覚的な方法を提供するユーザー・インターフェイスを公開することを意味します。 保持者 コーディネーターの一部の機能は、一般にデジタル・ウォレットと呼ばれます。この API では、保持者コーディネーターがすべてのフローを開始します。 それらは発行者から 検証可能なクレデンシャルを要求します。 それらは、それらの 検証可能なクレデンシャル検証者と共有するかどうか、 およびいつ共有するかを決定します。この API 内では、 発行者または検証者のいずれも、 検証可能なクレデンシャルの転送を 開始する方法はありません。多くのシナリオでは、保持者コーディネーターは、 個々の人間の管理下にあることが期待されており、転送を認可する段階だけであっても、 検証可能な クレデンシャルの通信に人が直接関与することを保証します。ただし、一部の 検証可能なクレデンシャルは、 個人ではなく組織に関するものです。組織に関連する 保持者コーディネーターを使用する個人がどのように関与するか、 特に、組織のクレデンシャルがそれらの組織の(法的な)代理人とどのように安全に共有され、 代理人によって提示されるかは、この仕様の範囲外です。

2.2 サービス

サービスは、 関連付けられたコーディネーターによって駆動される低レベルの API 機能を提供し、 サービスとしてのソフトウェアなどのサービス提供アーキテクチャを通じて、インフラストラクチャ・プロバイダーが 検証可能なクレデンシャル機能を 提供できるように設計されています。すべてのサービスは、認可された コーディネーターに HTTP エンドポイントを公開します。 これらのコーディネーター自身も、関連付けられた役割の代理として動作します。 配備されたサービスが独自の HTML インターフェイスを提供する場合もありますが、そのようなインターフェイスは この仕様の範囲外です。ここでは、サービスの HTTP エンドポイントのみを定義します。

発行者 サービスは、認可された発行者コーディネーターからの 検証可能なクレデンシャルを発行する要求を受け取り、 適合する検証可能な クレデンシャルを返します。このサービスは、 検証可能な クレデンシャルの証明を作成するために、秘密鍵や秘密鍵を利用するキー・サービスなどの 暗号素材にアクセスできます。発行者サービスと それに関連付けられた暗号鍵管理サービスとの間の API は、この仕様の範囲外です。

検証者サービスは、検証可能なクレデンシャル および検証可能な 提示を検証する要求を受け取り、それらの証明とステータス(存在する場合)を確認した結果を返します。 このサービスは、検証可能なクレデンシャルの 真正性と適時性のみを確認し、 検証者コーディネーターに、必要なビジネスルールの適用を完了させます。

保持者 サービスは、任意の検証可能なクレデンシャルのセットから Verifiable Presentations を作成する要求を受け取り、それらの VC を含む、整形式で署名済みの Verifiable Presentations を返します。これらの検証可能な 提示は、発行者に対して、 検証可能なクレデンシャル発行前に DID の制御を証明するため、および検証者に対して 特定の VC を提示するために使用されます。

ステータス サービスは、発行者によって発行された 任意の Verifiable Credentials のステータスを公開および確認するための、プライバシー保護手段を提供します。 検証者サービスの実装者は、検証可能なクレデンシャルで使用される各ステータス仕様を参照して、 ステータス確認のプライバシー上の影響を理解することが推奨されます。 検証可能なクレデンシャルの ステータスを管理する具体的なメカニズムについては、 [VC-BITSTRING-STATUS-LIST] などの よく知られた外部仕様を参照することが推奨されます。

ストレージ・サービスは、システム内の各アクターが、 必要に応じて自分自身の検証可能なクレデンシャルと対応するデータを保存するために使用します。 既知のいくつかの実装では、保持者検証可能なクレデンシャルを 保存するために、暗号化データ保管庫などのセキュアなデータ・ストレージを使用し、 暗号学的認可を使用して、検証可能なクレデンシャルへのアクセスを、 検証者コーディネーターに、保持者の指示に従って 付与します。ブラウザー内でそのような保存済みクレデンシャルを取得することにより、 Web ベースの検証者コーディネーターが、保持者からのデータを 検証者と共有することなく統合できるようになります。 そのデータはブラウザー内にのみ存在します。 保持者ストレージへの サードパーティのリモート・アクセスを認可することは、この API の範囲内である可能性が高いものの、 さまざまなストレージおよび認可アプローチをサポートするために、拡張可能なメカニズムを使用して 定義されることを期待しています。

発行者および 検証者の ストレージ・ソリューションは、セキュアなデータ・ストレージを使用する場合もしない場合もあります。 そのようなすべてのストレージのやり取りは、個別に作られた発行者 およびストレージ・コーディネーターによって仲介されるため、必要な統合は単にその個別カスタマイズの一部にできます。 さまざまなバックエンド・ストレージ・プラットフォームへの統合の容易さについて、 異なる実装が競争することを期待しています。

ワークフロー サービスは、コーディネーターが特定のユーザーのために特定のインタラクションを自動化する方法を提供します。 各役割(保持者発行者、および 検証者)は、 特定のワークフローを実現する交換を作成および管理するために、独自のワークフロー・サービスを実行できます。 管理者は、特定のフローをサポートするようワークフロー・システムを構成します。 その後、ビジネスルールがそれを正当化する場合、コーディネーターはワークフロー・サービスで交換を作成し、 それらの交換へのアクセスを任意の認可済み当事者に与えます。

管理サービスは、他の各コンポーネントが、 その構成のインターフェイスや手段を規定することなく、構成および管理される方法を必要とすることを認めるものです。 一部のコンポーネントは、コマンドライン・インターフェイスを駆動するために JSON ファイルを使用する場合があります。 他のコンポーネントは HTML ページを公開する場合があります。異なる実装は、 管理の能力、容易さ、および柔軟性において競争すると期待されるため、構成は大部分が この仕様の範囲外です。Section 3.6.1 ワークフローの作成のように、 いくつかの構成メカニズムが提供される場所もあります。そこでは、いくつかの構成パラメーターを標準化することについて 広範な合意がありました。市場が成熟するにつれて、将来のバージョンのこの仕様では、 構成標準化の他の領域が生じる可能性があります。

2.3 インスタンス

この仕様で定義される API は、システム管理者によって設定された関連構成を持つ 特定のインスタンスに関連付けられていることを前提とします。 クライアントが特定のインスタンス上のエンドポイントを呼び出すと、 インスタンスは、 構成とクライアントによって提供されるオプションを使用して、そのアクションを実行します。

たとえば、/credentials/issue エンドポイントは、 /instances/12345/credentials/issue のような長い URL の末尾に提供できます。 この場合、発行に使用する暗号鍵、ステータスリストが関与するかどうか、 発行するクレデンシャルの種類、クレデンシャル形式、およびそのエンドポイントで利用可能な追加オプションを 知るように構成されているのは、その インスタンスです。

特定のインスタンスを呼び出すソフトウェア・クライアントは、 インスタンスを構成する能力を持たない場合や、 管理者がインスタンスに対して行った設定を、その適切な利用に必要な詳細以外は認識していない場合があります。 インスタンスを構成するための 管理エンドポイントは、実装によって提供される可能性がありますが、必ずしも HTTP API として公開されるとは限りません。 構成は、構成ファイルやグラフィカル・インターフェイスを通じて行うこともできます。

注記: コーディネーターは 複数のサービス・インスタンスを使用できる

コーディネーター・インスタンスは、異なるユースケース、または複雑なフローを持つユースケースを サポートするために、複数のサービス・インスタンスへアクセスできます。 サービスは配備時点でコーディネーターに知られていることが 期待されるため、サービス・インスタンス構成の実行時発見はこの仕様では定義されません。

2.4 構成

コーディネーターまたはサービスインスタンスは、その動作を駆動する 特定の構成に関連付けられます。この節には、それらの構成の一部がどのように行われるかが含まれています。

ベース URL

任意の特定のインスタンスの ベース URL には制限は設けられていません。この仕様全体で使用される URL パスは絶対パスとして示され、 そのベース URL はサーバーのホスト名(例: website.example)、サブドメイン(例: api.website.example)、 またはそのドメイン内のパス(例: website.example/api)で MAY あります。

認可

この API は、敵対的なアクターを含む可能性のあるさまざまなネットワーク環境に配備できます。 その結果、適合するサービス実装は、特定の種類の要求を実行する際に、 適合するサービス・クライアント 実装がセキュアな認可技術を利用することを要求します。 この文書で定義される各 HTTP エンドポイントは、要求を実行する際に認可が必要かどうかを規定します。 この節で後述する禁止された認可プロトコルの種類を例外として、この API は認可メカニズムに関して 不可知です。

この API は、Verifiable Credentials の発行、所有、提示、および/または検証を必要とする 多くのシナリオで汎用的かつ有用であることを意図しています。この目的のために、 実装者は以下のユースケース分類を考慮することが推奨されます。

  • 公開。公開 API とは、認可なしで呼び出すことができる API です。 例には、オープンな証人またはタイムスタンプ・サービス(監査証跡の目的で、 タイムスタンプ付きでメッセージにデジタル署名できる信頼されたサービス)、 またはオープンな小売クーポン・エンドポイント(「1 つ買うと 1 つ無料」)が含まれます。 信頼シナリオにおいて不可知な第三者として機能する公開検証者も存在する場合があります。
  • 許可制。許可制の認可では、API 呼び出しを行うエンティティが、たとえば アクセス制御トークンやケイパビリティ URL を持っていること、または相互に信頼されたソースから ケイパビリティを呼び出すことが必要です。これらの許可は API へのアクセスを付与しますが、 クレデンシャル主体、以前のやり取りなどについてはいかなる仮定もしません。 許可制アクセスは、クレデンシャル主体が直接関与しないサービス間ベースのワークフローで 特に有用です。
  • 結合。結合された認可は、API 呼び出しが別のプロセスに密接に結び付けられ、 リンクされ、または結合されているシナリオを伴います。その別のプロセスは、 多くの場合帯域外で、API インタラクションの保持者/主体を認証しています。 これらのユースケースには、主体固有のアイデンティティ主張を対象の主体へ直接発行すること、 または保持者が検証者のサービスに適格であるかを判定するためのクレデンシャル検証などが含まれますが、 これらに限定されません。あるチャネルでの活動を API 呼び出しへ結合する方法の例には、 CHAPICredential Handler API)、OIDC(OpenID Connect)、 および GNAP(Grant Negotiation and Authorization Protocol)があります。 結合された認可を実装する開発者は、結合を適切に保護するために、フローにおいて適切な保証レベルが 達成されるよう対策を講じる必要があります。

この節の残りでは、適合する実装での使用が検討されている認可技術の例を示します。 その他の同等の認可技術も使用できます。実装者は、非標準またはレガシーな認可技術の使用に 注意するよう促されます。

禁止された認可

この API への要求は、その要求内にユーザー名とパスワード、または類似の値などの 長期間有効な静的クレデンシャルを含む認可プロトコルを MUST NOT 使用しません。 そのような禁止されたプロトコルの例は、HTTP Basic Authentication [RFC7617] です。

OAuth 2.0

OAuth 2.0 Authorization Framework [RFC6749] が 認可に使用される場合、 クライアントによって使用されるアクセストークンは OAuth 2.0 Bearer Tokens [RFC6750]、 またはその他の有効な OAuth 2.0 トークン種別で MAY あります。任意の有効な OAuth 2.0 グラント種別を アクセストークンの要求に MAY 使用できます。

VCALM OAuth 2.0 スコープ構文
scope = operation ":" path-absolute ([RFC3986] で定義)
operation = "read" / "write"

read 操作は、システム内のリソースを作成または更新しないアクションを、 提供されたパス上、または提供されたパスをプレフィックスとして含む任意のパス上で 実行できるようにします。write 操作は、システム内のリソースを作成 および/または更新するアクションを、提供されたパス上、または提供されたパスをプレフィックスとして含む 任意のパス上で実行できるようにします。

OAuth 2.0 スコープの例を以下に示します。

  • read:/ は、任意の特定のインスタンス上の任意の API を介した読み取りを許可します。
  • write:/ は、任意の特定のインスタンス上の任意の API を介した作成と変更を許可します。
  • read:/exchanges は、任意の特定のワークフロー・インスタンスから交換を読み取ることを許可します。
  • write:/credentials/issue は、任意の特定の発行者インスタンス上の クレデンシャル発行 API への書き込みを許可します。

read:/write:/ などの広範な OAuth 2.0 スコープは、 複数の発行者コーディネーターが、同じ 発行者 インスタンスを、 同じ 発行者サービス上でホストしている場合など、 マルチテナント環境においてセキュリティ脆弱性につながる可能性があります。 実装者は、JSON Web Tokens として表現されるアクセストークンに、 アクセストークンが適用される特定のインスタンスを識別する aud(audience)クレームを 含めることで、アクセストークンを特定のインスタンスに固定できるようにすることが推奨されます。 OAuth 2.0 スコープは、セキュリティ管理者に過度の負担とならない範囲で、 できるだけ狭く保つことが推奨されます。

オプション

以下の節で定義される一部のエンドポイントは、options オブジェクトを受け入れます。 options オブジェクトのすべてのプロパティは、各インスタンスを構成する際に OPTIONAL です。これは、これらのプロパティが配備ごとに異なる可能性のある ニーズを満たすことを意図しているためです。したがって、任意の特定のインスタンス構成は、 クライアントが特定のデータをそのインスタンスに渡すことを防ぐために、 一部の options プロパティのクライアント使用を MAY 禁止できます。同様に、インスタンス構成は、 クライアントが一部の options プロパティを含めることを MAY 要求できます。

実装は、追加のプロパティで options オブジェクトを MAY 拡張できます。

拡張プロパティは実装固有であるため、必須にすべきではありません。 これは、特定の実装を使用するためにクライアントの変更が必要になることを避け、 相互運用性を維持するためです。

拡張 options プロパティを追加する際は、クライアントに任意性を提供する必要があるかを 検討してください。不要である場合は、インスタンス構成を使用して API 機能を変化させる方が 望ましいアプローチである可能性があります。

実装は、エンドポイントが理解できない、または処理方法を知らないデータ、オプション、 またはオプション値を受け取った場合、エラーを MUST 投げます。

コンテンツのシリアライゼーション

この仕様で定義される API エンドポイントへ送信、またはそこから受信される要求および応答内の すべてのエンティティ本文は、JSON としてシリアライズされ、 メディア型値 application/json を持つ Content-Type ヘッダーを含めなければ MUST なりません。

ペイロードサイズ

実装者は、その実装が処理する Verifiable Credentials のペイロードサイズに注意を払うことが推奨されます。

提示は大量のクレデンシャルをまとめることができ、その結果、実装者が予想したよりも大きな 要求サイズになる可能性があります。これにより、相互運用性の問題のリスクが高まります。

相互運用性のベースラインとして、検証可能な クレデンシャルごとに 10MB の既定の最大サイズが RECOMMENDED され、必要に応じてより大きなサイズを構成できる可能性があります。 これは、ほとんどの文書ベースのデータベース・ストレージ・ソリューションの 16MB サイズ制限にも対応します。

既定では、大きなバイナリ値はリンクされ、ハッシュが含まれることが期待されます (そうしないプライバシー上の理由がある場合を除く)。

3. HTTP API

この節には、適合する実装を作成する際に従うべき HTTP API エンドポイント定義と実装ガイダンスが含まれています。

3.1 コンポーネント概要

この節では、エンドポイントが呼び出し可能であると想定されるコンポーネントごとに、 VC-API 内のすべてのエンドポイントの概要を示します。コンポーネントの下に一覧がない場合、 それは VC-API が現在そのコンポーネント用のエンドポイントを規定していないことを意味します。

発行者コーディネーター

以下は、発行者 コーディネーターによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
GET /interactions/{interactionId} 提供された URL を持つ誰でも 3.7.1 インタラクション URL 形式
POST /callbacks/{localCallbackId} ワークフロー・サービス 3.6.7 交換ステップのコールバック

発行者サービス

以下は、発行者 サービスによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
POST /credentials/issue 発行者コーディネーター、ワークフロー・サービス 3.2.1 クレデンシャルの発行
GET /credentials/{id} 発行者コーディネーター、保持者コーディネーター、ワークフロー・サービス 3.2.2 特定のクレデンシャルの取得
DELETE /credentials/{id} 発行者コーディネーター、保持者コーディネーター 3.2.3 特定のクレデンシャルの削除

検証者コーディネーター

以下は、検証者コーディネーターによって公開されることが期待される すべてのエンドポイントと、そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
GET /interactions/{interactionId} 提供された URL を持つ誰でも 3.7.1 インタラクション URL 形式
POST /callbacks/{localCallbackId} ワークフロー・サービス 3.6.7 交換ステップのコールバック

検証者サービス

以下は、検証者 サービスによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
POST /credentials/verify 検証者コーディネーター、ワークフロー・サービス 3.3.1 クレデンシャルの検証
POST /presentations/verify 検証者コーディネーター、ワークフロー・サービス 3.3.2 提示の検証
POST /challenges 検証者コーディネーター、ワークフロー・サービス 3.3.3 チャレンジの作成

保持者コーディネーター

以下は、保持者 コーディネーターによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
GET /interactions/{interactionId} 提供された URL を持つ誰でも 3.7.1 インタラクション URL 形式
POST /callbacks/{localCallbackId} ワークフロー・サービス 3.6.7 交換ステップのコールバック

保持者サービス

以下は、保持者 サービスによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
POST /credentials/derive 保持者コーディネーター、ワークフロー・サービス 3.5.1 クレデンシャルの導出
GET /credentials/{id} 発行者コーディネーター、保持者コーディネーター、ワークフロー・サービス 3.2.2 特定のクレデンシャルの取得
DELETE /credentials/{id} 発行者コーディネーター、保持者コーディネーター 3.2.3 特定のクレデンシャルの削除
GET /presentations 保持者コーディネーター、ワークフロー・サービス 3.5.3 提示の取得
POST /presentations 保持者コーディネーター、ワークフロー・サービス 3.5.2 提示の作成
GET /presentations/{id} 保持者コーディネーター、ワークフロー・サービス 3.5.4 特定の提示の取得
DELETE /presentations/{id} 保持者コーディネーター 3.5.5 特定の提示の削除

ステータス・サービス

以下は、ステータス サービスによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
POST /status-lists 発行者サービス C.1 ステータスリストの作成
GET /status-lists/{id} 公開 C.2 ステータスリストの取得
POST /credentials/status 発行者サービス C.3 ステータスの更新

ワークフロー・サービス

以下は、ワークフロー・サービスによって公開されることが期待されるすべてのエンドポイントと、 そのエンドポイントを呼び出すことが期待されるコンポーネントです。

エンドポイント 想定される呼び出し元 定義
POST /workflows 管理者 3.6.1 ワークフローの作成
GET /workflows/{localWorkflowId} 管理者 3.6.2 ワークフロー構成の取得
POST /workflows/{localWorkflowId}/exchanges コーディネーター 3.6.3 交換の作成
GET /workflows/{localWorkflowId}/exchanges/{localExchangeId} コーディネーター 3.6.6 交換状態の取得
POST /workflows/{localWorkflowId}/exchanges/{localExchangeId} 誰でも 3.6.5 交換への参加
GET /workflows/{localWorkflowId}/exchanges/{localExchangeId}/protocols 検証者コーディネーター、保持者コーディネーター 3.6.4 交換プロトコルの取得
POST /{inviteId}/invite-request/response /interactions/{interactionId} を含む URL に POST した者 3.7.4 インタラクション・プロトコル応答

3.2 発行

Verifiable Credential を発行するために、以下の API が定義されています。

エンドポイント 説明
GET /credentials/{id} ID によってクレデンシャルまたは検証可能なクレデンシャルを取得します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つ クレデンシャルを取得するには、代わりに credentialId を渡します。
DELETE /credentials/{id} ID によってクレデンシャルまたは検証可能なクレデンシャルを削除します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つ クレデンシャルを削除するには、代わりに credentialId を渡します。
POST /credentials/issue クレデンシャルを発行し、それを応答本文で返します。
POST /credentials/status 発行済みクレデンシャルのステータスを更新します
POST /status-lists 新しいステータスリストを作成します
GET /status-lists/{id} ステータスリスト・クレデンシャルを取得します

3.2.1 クレデンシャルの発行

このエンドポイントは、検証可能な クレデンシャルを発行するために使用されます。

注記: 発行済み クレデンシャルのメディア型

application/vc 以外のメディア型、たとえば application/mdocapplication/vc+sd-jwtapplication/vcb;barcode-format=qr_code、または application/vcb;barcode-format=pdf417 でクレデンシャルを発行するには、 応答で EnvelopedVerifiableCredential を返すことができます。

POST /credentials/issue - クレデンシャルを発行し、それを応答本文で返します。

/credentials/issue エンドポイントは、POST を受信する際に以下のスキーマを使用します。

プロパティ 説明
credential [object] 発行を意図した W3C Verifiable Credential。これは以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
オブジェクト、または
{
  "type": "array",
  "items": {
    "type": "object"
  }
}
options [object] クレデンシャルがどのように発行されるかを指定するためのオプション。 これは以下の形式のオブジェクトで MUST あります。
mandatoryPointers [array]
選択的開示方式で、必須の開示文を指定するために使用されます。 mandatoryPointers 配列内の各項目は文字列で MUST あります。
credentialId [string]
クレデンシャルを識別するために使用できる URI であり、API において 発行済みの検証可能なクレデンシャルを参照するために使用できます。 credentialId が発行者コーディネーターによって提供されない場合、 発行者サービスはその値を credential.id から自動的に設定します。 credentialId も credential.id も提供されない場合、発行後にこの クレデンシャルを参照することも、重複エラーを扱うこともできません。 credential.id プロパティが設定されている場合、credentialId は発行者 コーディネーターによって設定されるべきではなく、credential.id の代替として 使用されるべきでもありません。むしろ、credentialId は id プロパティ (すなわち credential.id)が設定されていないクレデンシャルを識別する手段です。 発行者サービスは、発行者コーディネーターから提供されない場合に credentialId を自動生成すべきではありません。そうすると、結果がクライアントに 受信されなかった場合にパーティショニング・エラーを生じさせる可能性があるためです。

/credentials/issue エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
201 クレデンシャルが正常に発行されました!
content-type: application/json
以下の形式のオブジェクト:
IssueCredentialResponse [object]
検証可能なクレデンシャルの正常な要求から返される形式。 これは以下の形式のオブジェクトで MUST あります。
verifiableCredential [object]
以下の形式のオブジェクトのいずれか。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。 Verifiable Credential は有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
または、エンベロープされた検証可能なクレデンシャルを 検証可能な提示内の verifiableCredential プロパティに関連付けるために 使用されるオブジェクト。これは以下の形式のオブジェクトで MUST あります。
@context [array]
エンベロープされた検証可能なクレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
これは、エンベロープ化セキュリティ方式を使用して保護された 検証可能なクレデンシャルを表す "data:" スキーム URL [RFC2397] で MUST あります。
type [string]
これは EnvelopedVerifiableCredential で MUST あります。
400 次のいずれかの理由により、要求を処理できませんでした: - 提供された 'issuer' の値が想定される構成と一致しません。 - Bad Request となる別の条件。

ユースケースが、発行者インスタンスに対して、提供された credential に複数の証明を付加することを要求する場合、 そのインスタンスは /credentials/issue エンドポイントへの 1 回の呼び出しに対する 応答として、それらすべての証明を付加しなければ MUST なりません。

提供された credential がすでに 1 つ以上の証明を含んでいる場合、 その挙動は発行者インスタンスの構成によって決定されます。発行インスタンスは、 以下のいずれかの方法で既存の証明を処理するよう構成される SHOULD です。

  • 証明セット: 呼び出し元によって提供された既存の証明のリストに 新しい証明を追加します。必要に応じて、既存の単一証明をまずリストに変換します。 ここでは既存の証明への結合はなく、新しい証明は呼び出し元が以前に提供した証明と並列に存在します。
  • 証明チェーン: 新しい証明を追加して、既存の証明チェーンを作成または拡張します。 ここでは、証明は特定の順序でリンクされ、チェーン関係を確立するために previousProof プロパティを使用する可能性があります。
  • エラー処理: インスタンスが既存の証明を持たないクレデンシャルのみを 受け入れるよう構成されている場合に、既存の proof 値を含む credential 値が提供されるとエラーを返します。

使用される具体的なアプローチは、発行者インスタンスの構成と、 検証可能なクレデンシャルの想定ユースケースに依存します。

3.2.2 特定のクレデンシャルの取得

GET /credentials/{id} - ID によってクレデンシャルまたは検証可能なクレデンシャルを取得します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つクレデンシャルを 取得するには、代わりに credentialId を渡します。

/credentials/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 クレデンシャルが取得されました
content-type: application/json
検証可能なクレデンシャルの正常な要求から返される形式。 これは以下の形式のオブジェクトで MUST あります。
verifiableCredential [object]
以下の形式のオブジェクトのいずれか。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。 Verifiable Credential は有効であるために id プロパティを 必要とせず、id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
または、エンベロープされた検証可能なクレデンシャルを 検証可能な提示内の verifiableCredential プロパティに関連付けるために 使用されるオブジェクト。これは以下の形式のオブジェクトで MUST あります。
@context [array]
エンベロープされた検証可能なクレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
これは、エンベロープ化セキュリティ方式を使用して保護された 検証可能なクレデンシャルを表す "data:" スキーム URL [RFC2397] で MUST あります。
type [string]
これは EnvelopedVerifiableCredential で MUST あります。
400 Bad Request
401 認可されていません
404 クレデンシャルが見つかりません
410 Gone! ここにデータはありません
418 私はティーポットです - 両当事者間で事前に取り決められたシナリオ以外では 返しては MUST なりません

3.2.3 特定の クレデンシャルの削除

発行者サービスまたは保持者 サービスは、発行済みの検証可能な クレデンシャルを長期間保存する場合があります。これが行われる場合、 そのような検証可能な クレデンシャルを削除できることが有用な場合があります。たとえば、発行者は、 忘れられる権利などの規制上の要件により、そうする必要がある場合があります。 システムから検証可能な クレデンシャルを削除することに関連する追加の考慮事項については、 Section B.3 削除 を参照してください。

DELETE /credentials/{id} - ID によってクレデンシャルまたは検証可能なクレデンシャルを削除します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つクレデンシャルを 削除するには、代わりに credentialId を渡します。

/credentials/{id} エンドポイントは、DELETE を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
202 クレデンシャルが削除されました - ソフト削除と処理時間が想定されるため、 これは既定で 202 です
400 Bad Request
401 認可されていません
404 クレデンシャルが見つかりません
410 Gone! ここにデータはありません

3.3 検証

Verifiable Credential を検証するために、以下の API が定義されています。

エンドポイント 説明
POST /credentials/verify verifiableCredential を検証し、応答本文で verificationResult を返します。
POST /presentations/verify Presentation と、それに含まれるすべての Verifiable Credentials を検証し、詳細な 検証結果を返します。
POST /challenges このエンドポイントに空の本文を渡すと、チャレンジ文字列を作成し、 応答本文で返します。

3.3.1 クレデンシャルの検証

このエンドポイントは、検証可能な クレデンシャルを検証するために使用されます。

注記: クレデンシャルを検証する メディア型

application/vc 以外のメディア型、たとえば application/mdocapplication/vc+sd-jwtapplication/vcb;barcode-format=qr_code、または application/vcb;barcode-format=pdf417 のクレデンシャルを検証するには、 要求で EnvelopedVerifiableCredential を提供できます。

POST /credentials/verify - verifiableCredential を検証し、応答本文で verificationResult を 返します。

/credentials/verify エンドポイントは、POST を受信する際に以下のいずれかのスキーマを使用します。

プロパティ 説明
verifiableCredential [object] 以下の形式のオブジェクト:
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
options [object] クレデンシャルがどのように検証されるかを指定するためのオプション。 これは以下の形式のオブジェクトで MUST あります。
returnResults [boolean]
個々の証明、ステータス、スキーマの検証など、応答で実行された 各検証ステップの結果を含めます。
returnProblemDetails [boolean]
応答に ProblemDetails エラーと警告を含めます。
returnCredential [boolean]
検証済みクレデンシャルを応答で返すべきかどうか。true の場合、 検証済みクレデンシャルは検証された形式で返されるべきです。 false または未提供の場合、検証済みクレデンシャルは返されるべきではありません。

あるいは、/credentials/verify エンドポイントは以下のスキーマも使用できます。

プロパティ 説明
verifiableCredential [object] エンベロープされた検証可能なクレデンシャルを、検証可能な提示内の verifiableCredential プロパティに関連付けるために使用されるオブジェクト。 これは以下の形式のオブジェクトで MUST あります。
@context [array]
エンベロープされた検証可能なクレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
これは、エンベロープ化セキュリティ方式を使用して保護された 検証可能なクレデンシャルを表す "data:" スキーム URL [RFC2397] で MUST あります。
type [string]
これは EnvelopedVerifiableCredential で MUST あります。
options [object] クレデンシャルがどのように検証されるかを指定するためのオプション。 これは以下の形式のオブジェクトで MUST あります。
returnResults [boolean]
個々の証明、ステータス、スキーマの検証など、応答で実行された 各検証ステップの結果を含めます。
returnProblemDetails [boolean]
応答に ProblemDetails エラーと警告を含めます。
returnCredential [boolean]
検証済みクレデンシャルを応答で返すべきかどうか。true の場合、 検証済みクレデンシャルは検証された形式で返されるべきです。 false または未提供の場合、検証済みクレデンシャルは返されるべきではありません。

/credentials/verify エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 Verifiable Credential が正常に検証されました!
content-type: application/json
VerifiableCredential に対する検証プロセスの結果を報告するオブジェクト。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
VerifiableCredential の全体的な検証アサーション。 検証プロセス中にエラーが検出されなかった場合は true に設定され、 それ以外の場合は false に設定されます。エラー、警告、 検証ステップに関する詳細なガイダンスについては、エラー処理の節を参照してください。
credential [object]
オブジェクト
problemDetails [array]
ProblemDetails オブジェクトで構成される配列。 problemDetails 配列内の各項目は以下の形式の オブジェクトで MUST あります。
type [string]
問題の種類を識別する URL。
title [string]
問題に対する短く具体的な人間可読文字列。
detail [string]
問題に対するより長い人間可読文字列。
results [object]
より詳細な出力として含められる検証結果。キーは Verifiable Credential Data Model のプロパティにマップされます。 これは以下の形式のオブジェクトで MUST あります。
validFrom [object]
VerifiableCredential に存在する場合、validFrom プロパティを検証した結果。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
検証結果。
input [string]
validFrom の値。
validUntil [object]
VerifiableCredential に存在する場合、validUntil プロパティを検証した結果。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
検証結果。
input [string]
validUntil の値。
credentialSchema [array]
credentialSchema オブジェクトがある場合、それらを検証した結果。 credentialSchema 配列内の各項目は、 credentialSchema オブジェクトを検証した結果で MUST あります。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
credentialSchema オブジェクトを検証した結果。
input [object]
オブジェクト
credentialStatus [array]
credentialStatus オブジェクトがある場合、それらを検証した結果。 credentialStatus 配列内の各項目は、 credentialStatus オブジェクトを検証した結果で MUST あります。 これは以下の形式のオブジェクトで MUST あります。
value [integer]
ステータス項目に関連付けられた特定のステータス値。
verified [boolean]
credentialStatus オブジェクトを検証した結果。
input [object]
オブジェクト
proof [array]
proof オブジェクトがある場合、それらを検証した結果。 proof 配列内の各項目は、proof オブジェクトを検証した結果で MUST あります。これは以下の形式の オブジェクトで MUST あります。
verified [boolean]
proof オブジェクトを検証した結果。
input [object]
オブジェクト
400 無効な入力です!

3.3.2 提示の検証

このエンドポイントは、検証可能な 提示と、既定ではその中に含まれるすべての検証可能な クレデンシャルを検証するために使用されます。

検証プロセスには以下が含まれます。

  • 提示自体の証明の検証(domain と challenge の検証を含む)
  • 含まれる各検証可能なクレデンシャルの証明、ステータス、および有効期間の検証
  • 提示内の holder が、提示の証明で使用された検証メソッドと一致することの確認

ビジネスルールの検証(クレデンシャル主体が提示保持者と一致することの検証、 または誰がどのクレデンシャルを提示できるかに関する認可ポリシーなど)は、 この検証エンドポイントの範囲外であり、呼び出し元アプリケーションによって実行されるべきです。

POST /presentations/verify - Presentation と、それに含まれるすべての Verifiable Credentials を検証し、 詳細な検証結果を返します。

/presentations/verify エンドポイントは、POST を受信する際に以下のいずれかのスキーマを使用します。

プロパティ 説明
verifiablePresentation [object] 以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は、以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
options [object] 提示がどのように検証されるかを指定するためのオプション。 実装は、検証動作を制御するために追加のプロパティでこのオブジェクトを MAY 拡張できます。一般的な拡張には、 含まれるクレデンシャルの検証を無効にするオプション(たとえばデバッグ用、 または提示レベルの検証のみが必要な場合)、ステータス確認、有効期間検証、 証明検証、スキーマ検証などのクレデンシャル側面の検証に対する細かな制御、 および提示内の特定のクレデンシャルに対する選択的な検証制御が含まれる場合があります。 クレデンシャル検証が無効化または制限される場合、この API は合成可能です。 個々のクレデンシャルは /credentials/verify エンドポイントを使用して個別に検証できます。 これは以下の形式のオブジェクトで MUST あります。
challenge [string]
証明の要求当事者によって提供されるチャレンジ。たとえば、 6e62f66e-67de-11eb-b490-ef3eeefa55f2
domain [string]
証明の意図された有効ドメイン。たとえば、 website.example
returnPresentation [boolean]
検証済み提示を返すかどうか。true の場合、検証済み提示は MUST 返されます。false または未提供の場合、 検証済み提示は MUST NOT 返されません。

あるいは、/presentations/verify エンドポイントは以下のスキーマも使用できます。

プロパティ 説明
presentation [object] 証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の オブジェクトで MUST あります。
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は、以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
プロパティ 説明
verifiablePresentation [object] エンベロープされた検証可能な提示を表現するために使用されるオブジェクト。 これは以下の形式のオブジェクトで MUST あります。
@context [array]
エンベロープされた検証可能な提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
これは、エンベロープ化セキュリティ方式を使用して保護された 検証可能な提示を表す "data:" スキーム URL [RFC2397] で MUST あります。
type [string]
これは EnvelopedVerifiablePresentation で MUST あります。
options [object] 提示がどのように検証されるかを指定するためのオプション。 実装は、検証動作を制御するために追加のプロパティでこのオブジェクトを MAY 拡張できます。一般的な拡張には、 含まれるクレデンシャルの検証を無効にするオプション(たとえばデバッグ用、 または提示レベルの検証のみが必要な場合)、ステータス確認、有効期間検証、 証明検証、スキーマ検証などのクレデンシャル側面の検証に対する細かな制御、 および提示内の特定のクレデンシャルに対する選択的な検証制御が含まれる場合があります。 クレデンシャル検証が無効化または制限される場合、この API は合成可能です。 個々のクレデンシャルは /credentials/verify エンドポイントを使用して個別に検証できます。 これは以下の形式のオブジェクトで MUST あります。
challenge [string]
証明の要求当事者によって提供されるチャレンジ。たとえば、 6e62f66e-67de-11eb-b490-ef3eeefa55f2
domain [string]
証明の意図された有効ドメイン。たとえば、 website.example
returnPresentation [boolean]
検証済み提示を返すかどうか。true の場合、検証済み提示は MUST 返されます。false または未提供の場合、 検証済み提示は MUST NOT 返されません。

/presentations/verify エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 検証プロセスが正常に完了しました。応答本文には、 提示とそれに含まれるクレデンシャルが検証に合格したか失敗したかを示す 詳細な結果が含まれます。 <code>200</code> ステータスは、提示および/またはクレデンシャルが 有効または無効と判定されたかどうかに関係なく、 検証プロセス自体が成功したことを示します。
content-type: application/json
VerifiablePresentation に対する検証プロセスの結果を報告するオブジェクト。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
VerifiablePresentation の全体的な検証アサーション。 VerifiablePresentation と、確認されたすべての VerifiableCredentials が 検証に合格した場合は true に設定され、それ以外の場合は false に設定されます。エラーと警告、および 検証と妥当性確認のステップに関する詳細なガイダンスについては、 エラー処理の節を参照してください。
verifiablePresentation [object]
オブジェクト
problemDetails [array]
提示レベル全体の問題に対する ProblemDetails オブジェクトで構成される配列。 problemDetails 配列内の各項目は以下の形式の オブジェクトで MUST あります。
type [string]
問題の種類を識別する URL。
title [string]
問題に対する短く具体的な人間可読文字列。
detail [string]
問題に対するより長い人間可読文字列。
results [object]
既定では、VerifiablePresentation と、その中に含まれるすべての VerifiableCredentials の両方に対する詳細な検証結果。キーは、 妥当性確認の対象となる Verifiable Credential Data Model のプロパティに マップされます。これは以下の形式のオブジェクトで MUST あります。
presentation [object]
VerifiablePresentation 自体(その中に含まれる VerifiableCredentials ではない) に固有の検証結果。これは以下の形式のオブジェクトで MUST あります。
challenge [object]
検証オプションで提供されている場合、提供されたすべての 証明にわたってセキュリティ・チャレンジを検証した結果。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
提供されたすべての証明にわたってセキュリティ・チャレンジを 検証した結果。
input [string]
チャレンジ入力文字列。
domain [object]
検証オプションで提供されている場合、提供されたすべての証明に わたってセキュリティ・ドメインを検証した結果。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
提供されたすべての証明にわたってセキュリティ・ドメインを 検証した結果。
input [string]
セキュリティ・ドメイン入力文字列。
holder [object]
holder がある場合、それを検証した結果。これは以下の形式の オブジェクトで MUST あります。
verified [boolean]
holder を検証した結果。
input [string]
holder 入力文字列。
proof [array]
proof オブジェクトがある場合、それらを検証した結果。 proof 配列内の各項目は、proof オブジェクトを 検証した結果で MUST あります。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
proof オブジェクトを検証した結果。
input [object]
オブジェクト
problemDetails [array]
この証明に固有の問題。 problemDetails 配列内の各項目は 以下の形式のオブジェクトで MUST あります。
type [string]
問題の種類を識別する URL。
title [string]
問題に対する短く具体的な人間可読文字列。
detail [string]
問題に対するより長い人間可読文字列。
credentials [array]
VerifiablePresentation 内の各 VerifiableCredential に対する 詳細な検証結果。credentials 配列内の各項目は、 VerifiableCredential に対する検証プロセスの結果を報告する オブジェクトで MUST あります。 これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
VerifiableCredential の全体的な検証アサーション。 検証プロセス中にエラーが検出されなかった場合は true に設定され、それ以外の場合は false に設定されます。エラー、警告、 検証ステップに関する詳細なガイダンスについては、 エラー処理の節を参照してください。
credential [object]
オブジェクト
problemDetails [array]
ProblemDetails オブジェクトで構成される配列。 problemDetails 配列内の各項目は 以下の形式のオブジェクトで MUST あります。
type [string]
問題の種類を識別する URL。
title [string]
問題に対する短く具体的な人間可読文字列。
detail [string]
問題に対するより長い人間可読文字列。
results [object]
より詳細な出力として含められる検証結果。キーは Verifiable Credential Data Model のプロパティに マップされます。これは以下の形式のオブジェクトで MUST あります。
validFrom [object]
VerifiableCredential に存在する場合、 validFrom プロパティを検証した結果。これは 以下の形式のオブジェクトで MUST あります。
verified [boolean]
検証結果。
input [string]
validFrom の値。
validUntil [object]
VerifiableCredential に存在する場合、 validUntil プロパティを検証した結果。これは 以下の形式のオブジェクトで MUST あります。
verified [boolean]
検証結果。
input [string]
validUntil の値。
credentialSchema [array]
credentialSchema オブジェクトがある場合、 それらを検証した結果。credentialSchema 配列内の各項目は、credentialSchema オブジェクトを 検証した結果で MUST あります。これは以下の形式のオブジェクトで MUST あります。
verified [boolean]
credentialSchema オブジェクトを検証した結果。
input [object]
オブジェクト
credentialStatus [array]
credentialStatus オブジェクトがある場合、 それらを検証した結果。credentialStatus 配列内の各項目は、credentialStatus オブジェクトを 検証した結果で MUST あります。これは以下の形式のオブジェクトで MUST あります。
value [integer]
ステータス項目に関連付けられた特定のステータス値。
verified [boolean]
credentialStatus オブジェクトを検証した結果。
input [object]
オブジェクト
proof [array]
proof オブジェクトがある場合、それらを検証した結果。 proof 配列内の各項目は、 proof オブジェクトを検証した結果で MUST あります。これは 以下の形式のオブジェクトで MUST あります。
verified [boolean]
proof オブジェクトを検証した結果。
input [object]
オブジェクト
400 検証プロセスの実行を妨げた、無効または不正な形式の入力。 これは、検証失敗ではなく、要求の形式、構造、またはパラメーターに関する 問題を示します。
413 ペイロードが大きすぎます
429 要求レート制限を超過しました。

3.3.3 チャレンジの作成

POST /challenges - このエンドポイントに空の本文を渡すと、チャレンジ文字列を作成し、 応答本文で返します。

/challenges エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 チャレンジが作成されました
content-type: application/json
challenge を含むオブジェクト。これは以下の形式のオブジェクトで MUST あります。
challenge [string]
チャレンジ値
400 無効または不正な形式の入力

インスタンスは、検証中に使用するためのチャレンジを作成し、そのチャレンジが options.challenge として検証エンドポイントに渡された回数を追跡すべきです。

3.4 提示の要求

検証可能な クレデンシャルおよび分散型 識別子ベースの認証を扱う場合、ある当事者が別の当事者からデータを要求する必要がしばしばあります。 この節では、それらの要求の一般的な形式について説明し、具体的な検証可能な提示要求形式も提供します。

3.4.1 検証可能な 提示要求

検証可能な提示要求とは、 検証者保持者に対して 提示を求める 要求です。1 つ以上のクレデンシャルを検証可能な 提示で包んだものを要求するために、 検証者は、 保持者から受け取りたい 1 つ以上のクレデンシャルを記述する JSON 要求を構築します。要求の一般的な形式は 次のようになります。

1: 検証可能な提示要求の一般形式
{
  // one or more requests for verifiable credentials
  "query": [{
    "type": "QueryByExample",
    // query details specific to QueryByExample...
  }],
  // The target security domain, such as a website domain, to include in
  // the verifiable presentation
  "domain": "domain.example",

  // The random challenge string to include in the verifiable presentation
  "challenge": "f63cb0d2-760e-11f0-a2b1-67febb854a5f"
}

query プロパティは、提示内のデータに対する要求のための 主要な拡張ポイント・メカニズムとして機能します。この文書は共通のクエリ・メカニズム (Section 3.4.2 例によるクエリを参照)を定義しますが、 すべての query オブジェクトは以下の形式です。

query
検証者によって要求される情報を指定する REQUIRED プロパティ。値は 1 つ以上の マップMUST あり、各マップは、 関連付けられた文字列値を持つ type プロパティを MUST 定義します。
domain
検証者保持者に対して 提示要求中に提供する OPTIONAL文字列保持者は、 そのデータが、やり取りしている Web サイトのドメインなどのドメインに関連付けられていることを確認し、 関連付けられている場合は、そのデータを検証可能な 提示に含めます。domain は、 保持者検証可能な 提示を特定の検証者に限定することを保証し、 検証者リプレイ攻撃から保護するために使用されます。
challenge
特定の提示要求中に、 検証者から 保持者に 提供される、OPTIONAL で一意の 文字列保持者は、 このデータを検証可能な 提示に含めて検証者に渡し、 検証者リプレイ 攻撃から保護します。

3.4.2 例によるクエリ

"query by example" クレデンシャル・クエリ形式は、特定のビジネスプロセスを可能にするために、 開発者が 1 つ以上の検証可能な クレデンシャルから必要な主張を 容易に要求できるように設計されています。このクエリでは、検証者が信頼する 1 つ以上の発行者など、 その他の情報も指定できます。

QueryByExample クエリ内の credentialQuery プロパティは単一のオブジェクトです。 複数のクエリを組み合わせるための論理 "AND" および "OR" 操作は、 Section 3.4.5 クエリ内の論理演算で説明されているように、 クエリレベルの group プロパティを通じて処理されます。 同じ group 値を持つ複数のクエリは "AND" 操作として処理され、 異なる、または欠落している group 値を持つクエリは "OR" 操作として処理されます。

2: Query By Example クエリ
{
  "query": [{
    "type": "QueryByExample",
    "credentialQuery": {
      // (Optional) Reason for requesting this credential that
      // may be shown to a user by their software
      "reason": "We need to know if you are an alumni of this school.",
      // (Optional) An example of the credential being requested
      "example": {
        "@context": [
          "https://www.w3.org/ns/credentials/v2",
          "https://www.w3.org/ns/credentials/examples/v2"
        ],
        "type": "ExampleAlumniCredential",
        // (Optional) Select credential based on credential subject type
        "credentialSubject": {
          "type": "Alumni"
        }
      },
      // (Optional) Specify credentials from particular acceptedIssuers or
      // delegates of the authority
      "acceptedIssuers": [{
        "issuer": "did:web:authority.example"
      }]
    }
  }],
  "challenge": "3182bdea-63d9-11ea-b6de-3b7c1404d57f",
  "domain": "reunion.example"
}

credentialQuery オブジェクトは、以下のプロパティをサポートします。

プロパティ 説明
reason クレデンシャルが要求されている理由について、人間可読な説明を提供する OPTIONAL文字列。 これは、保持者に対して、 そのソフトウェアによって MAY 表示されます。
example 要求されているクレデンシャルの例を提供する OPTIONAL なオブジェクト。 必要な主張を示すために、その @contexttype、 および任意で credentialSubject フィールドを含みます。
acceptedIssuers 検証者が、 検証可能な クレデンシャルの発行者として認識し受け入れるエンティティを識別する、 項目または項目を含むリストの OPTIONAL な配列。 各項目は、1) 受信した検証可能な クレデンシャルissuer プロパティ内の 発行者を識別する [URL]、または 2) 受信した検証可能な クレデンシャルissuer プロパティ内の 発行者を識別する [URL] を値とする id プロパティを含むオブジェクト、 または 3) type プロパティが RecognizedEntityCredential に設定され、id プロパティが Recognized Entities v1.0 仕様で定義されるそのようなクレデンシャルを指す [URL] 値を持つオブジェクトに関連付けられた recognizedIn プロパティを含むオブジェクトで MUST あります。このリストには、検証者が 受け入れ可能とする認識済み発行者が含まれます。有効な例の値には以下が含まれます。
  • did:web:red-issuer.example
  • https://blue-issuer.example/
  • {"id": "did:web:green-issuer.example"}
  • {"recognizedIn": {"id": "https://url.example/list.vc", "type": "RecognizedEntityCredential"}}
acceptedCryptosuites 検証者が どの暗号証明スイートを受け入れるかを指定する OPTIONAL な配列。各要素は、Data Integrity 暗号スイート名、 またはレガシー用の Ed25519Signature2020 を参照する cryptosuite プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用され、 暗号スイート名として解釈されます)。これにより、保持者は 適切な証明形式を選択できます。このプロパティは、 エンベロープされたクレデンシャルにのみ適用される acceptedEnvelopes とは独立して MAY 使用できます。 有効な例の値には以下が含まれます。
  • [{"cryptosuite": "eddsa-rdfc-2022"}, {"cryptosuite": "ecdsa-rdfc-2019"}]
  • [{"cryptosuite": "bbs-2023"}, {"cryptosuite": "ecdsa-sd-2023"}]
acceptedEnvelopes 検証者が どのエンベロープ形式を受け入れるかを指定する OPTIONAL な配列。各要素は、エンベロープ用の メディア型を参照する mediaType プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用され、 メディア型として解釈されます)。これにより、保持者は、 既定の Data Integrity 形式以外の形式でクレデンシャルを提供できます。 このプロパティは、受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ 適用される acceptedCryptosuites とは独立して MAY 使用できます。有効な例の値には以下が含まれます。
  • [{"mediaType": "application/jwt"}]
  • [{"mediaType": "application/vc+sd-jwt"}]

QueryByExample の JSON Schema は、ソフトウェア・システムへの統合用に 別ファイルで提供されています

以下の例は、受け入れ可能な暗号スイートとエンベロープ形式を指定する QueryByExample を示し、 保持者が 適切な証明メカニズムを選択できるようにします。

3: 受け入れ可能な暗号スイートと エンベロープを持つ Query By Example
{
  "query": [{
    "type": "QueryByExample",
    "credentialQuery": {
      "reason": "Please present your PermanentResidentCard to complete the verification process.",
      "example": {
        "@context": [
          "https://www.w3.org/ns/credentials/v2",
          "https://w3id.org/citizenship/v3"
        ],
        "type": ["PermanentResidentCard"],
        "credentialSubject": {
          "birthCountry": ""
        }
      },
      "acceptedCryptosuites": [
        {"cryptosuite": "eddsa-rdfc-2022"},
        {"cryptosuite": "ecdsa-rdfc-2019"},
        {"cryptosuite": "bbs-2023"},
        {"cryptosuite": "ecdsa-sd-2023"}
      ],
      "acceptedEnvelopes": [
        {"mediaType": "application/jwt"},
        {"mediaType": "application/vc+sd-jwt"}
      ]
    }
  }],
  "challenge": "9876fedc-ba98-7654-3210-fedcba987654",
  "domain": "immigration.example"
}

上記の例では、検証者は、 一覧表示された暗号スイートのいずれかで保護されたクレデンシャルを受け入れることを示しています。 bbs-2023ecdsa-sd-2023 を含めることで、 検証者は 選択的開示証明が受け入れ可能であることを示し、保持者が クレデンシャル全体ではなく birthCountry フィールドのみを開示できるようにします。 acceptedEnvelopes プロパティは、JWT ベースのエンベロープ形式も 受け入れ可能であることを示します。

注記: Query By Example を使用した 選択的開示

Query By Example に含まれる任意のフィールドは必須フィールドです。つまり、選択的開示を可能にするために Query By Example を使用する場合、要求者は、そのユースケースに不要なフィールドを クエリに含めないよう注意する必要があります。Query By Example には「任意」のフィールドを示す方法はありません。 したがって、要求されているものを超える情報を応答が明らかにしないようにすることは、 クエリに応答するウォレット次第です。注記: 検証可能なクレデンシャルの一部の保護メカニズムは 選択的開示を許可しません。このような場合、要求された情報を送信するために、 要求されていない情報も送信しなければならないことがあります。デジタル・ウォレットは、 どの情報が共有されるかをユーザーに通知することが期待されています。 期待される値について何も述べずにフィールドを要求するには、要求者は要求内にそのフィールドを含め、 値を空文字列のままにできます。たとえば、要求者が名を必要とする場合、 任意の "credentialSubject" オブジェクトに単一のフィールド "firstName": "" を含めることができます。 これにより、ウォレットは、他のフィールドを含める期待なしに、要求されたクレデンシャルの firstName のみで応答できます。_これは、ウォレットがクエリへの応答に 追加フィールドを含めて過剰共有することを防ぐものではありません。_ 選択的開示暗号スイートが受け入れ可能であることを示すために、検証者は、 acceptedCryptosuites 配列に bbs-2023 または ecdsa-sd-2023 などの暗号スイートを含める SHOULD です。

3.4.3 DID 認証

この節では、検証者が、 保持者に対して Decentralized Identifier ベースの認証 [DID-CORE] の実行を 要求する方法を定義します。最も単純な形式では、認証プロトコルは 検証者によるチャレンジと、 保持者による応答で構成されます。

4: DID 認証要求
{
  "query": [{
    "type": "DIDAuthentication",
    "acceptedMethods": [{"method": "example"}]
  }],
  "challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
  "domain": "example.com"
}

上記の DID Authentication 要求は、検証者が、 提供されたチャレンジに対するデジタル署名を生成することで、保持者に DID に対する制御を証明してほしいことを指定します。保持者は 次の応答を提供して応答する場合があります。

5: DID 認証応答
{
  "@context": ["https://www.w3.org/ns/credentials/v2"],
  "type": "VerifiablePresentation",
  "holder": "did:example:12345",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "verificationMethod": "did:example:12345#key-1",
    "challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
    "domain": "example.com",
    "created": "2024-02-25T14:58:42Z",
    "proofPurpose": "authentication",
    "proofValue": "z3FXQjecWufY46...UAUL5n2Brbx"
  }
}
3.4.3.1 DID 認証クエリ形式

DID Authentication クエリ形式は、検証者が、 保持者に 特定の方法で認証するよう要求できるようにします。DID Authentication クエリは、 以下の形式で MUST あります。

プロパティ 説明
type DIDAuthentication に設定されて MUST いる REQUIRED な文字列値。
acceptedMethods 検証者が、 一覧にある任意の DID Method を受け入れることを表すオブジェクトの任意の配列。 配列内の各オブジェクトは、 DID Method 名を値とする method というプロパティを MUST 含み、DID Method に固有のその他のプロパティを MAY 含みます。有効な例の値には以下が含まれます。
  • [{"method": "key"}]
  • [{"method": "key"}, {"method": "web"}]
acceptedCryptosuites この検証者に 提出される暗号証明を生成する際に、保持者が その中から MUST 選択する暗号スイートを伝える 任意のオブジェクト配列。配列内の各オブジェクトは、Data Integrity 暗号スイート名 (またはレガシー用の Ed25519Signature2020)を値とする cryptosuite というプロパティを MUST 含み、 暗号スイートに固有のその他のプロパティを MAY 含みます。 有効な例の値には以下が含まれます。
  • [{"cryptosuite": "eddsa-rdfc-2022"}]
  • [{"cryptosuite": "ecdsa-rdfc-2019"}, {"cryptosuite": "bbs-2023"}]

以下の例は、検証者が、 Credential Handler API (CHAPI) などの確立済み通信チャネル上で認証するために、 保持者に DID Web メソッドと Data Integrity ECDSA 暗号スイートを使用してほしいことを示します。

6: did:web と ecdsa-rdfc-2019 を使用する DID 認証要求
{
  "query": [{
    "type": "DIDAuthentication",
    "acceptedMethods": [{"method": "key"}],
    "acceptedCryptosuites": [{"cryptosuite": "ecdsa-rdfc-2019"}]
  }],
  "challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
  "domain": "example.com"
}

次の例では、検証者は、 保持者に、 DID Key または DID Web メソッドのいずれかを、標準の EdDSA Data Integrity 暗号スイートとともに 使用してほしいこと、任意で Data Integrity BBS 証明を実行できることを示す暗号証明を含めること、 そして別の通信チャネル、この場合は Verifiable Credential API HTTP エンドポイントを使用して 認証してほしいことを示しています。

7: 複雑な DID 認証要求
{
  "query": [{
    "type": "DIDAuthentication",
    "acceptedMethods": [{"method": "key"}, {"method": "web"}],
    "acceptedCryptosuites": [{"cryptosuite": "ecdsa-rdfc-2019"}]
  }, {
    "type": "DIDAuthentication",
    "required": false,
    "acceptedMethods": [{"method": "key"}, {"method": "web"}],
    "acceptedCryptosuites": [{"cryptosuite": "bbs-2023"}]
  }],
  "challenge": "zLEwtBYgQVNR4tyeo",
  "domain": "didauth.example"
}
3.4.3.2 DID 認証応答形式

DID Authentication 応答形式は、保持者検証者によって要求された情報を 提供できるようにします。DID Authentication 応答は、以下の形式の 検証可能な 提示MUST あります。

プロパティ 説明
type VerifiablePresentation に設定されて MUST いる REQUIRED な文字列値。
holder DID Authentication クエリで要求された型の特定の DID に設定されて MUST いる REQUIRED な文字列値。
proof DID Authentication クエリで要求された 1 つ以上の特定のデジタル証明型で MUST ある REQUIRED な値。 各 proof オブジェクトは、DID Authentication クエリで提供された domain 値と challenge 値を MUST 含みます。保持者 実装は、検証者によって指定された domain が、現在の通信チャネルで使用されるドメインと一致することを MUST 保証します。

保持者実装が、 verifier によって提供された domain を 現在の通信チャネルで使用されるドメインと照合することは極めて重要です。 保持者がこれを行わない場合、 不正な検証者は、 そのメッセージを自分のものではないドメインにリプレイできるようになります。 たとえば、evil.example ドメインから動作する不正な検証者が、 あなたの銀行からチャレンジを取得し、yourbank.example の domain 値を指定し、 その後あなたの応答を銀行にリプレイして、あなたの金融口座へのアクセスを取得する可能性があります。 実装が検証可能な 提示を生成する際に適切なドメインが使用されることを保証する限り、 この攻撃は軽減されます。

以下の例は、単純な DID Authentication 応答を示します。

8: did:key を使用する DID 認証応答
{
  "@context": ["https://www.w3.org/ns/credentials/v2"],
  "type": "VerifiablePresentation",
  "holder": "did:example:12345",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "verificationMethod": "did:example:12345#key-1",
    "challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
    "domain": "example.com",
    "created": "2024-02-25T14:58:42Z",
    "proofPurpose": "authentication",
    "proofValue": "z3FXQjecWufY46...UAUL5n2Brbx"
  }
}

3.4.4 認可 ケイパビリティ要求

課題 2

Authorization Capability のクエリと応答は、現時点では標準化されない可能性があります。 この例は、検証可能なクレデンシャルおよび mDL/mdoc だけが照会可能な クレデンシャルの種類ではないことを示すために提供されています。

このクエリ型は、Verifiable Presentation 内で Authorization Capabilities または "zcaps" を求める要求に含まれます。

9: Authorization Capability Request クエリ
{
  "query": [{
    "type": "AuthorizationCapabilityQuery",
    "capabilityQuery": [{
      "referenceId": "a-memorable-name",
      "allowedAction": ["read", "write"],
      "controller": "did:example:1234",
      "invocationTarget": {
        "type": "urn:edv:documents"
      }
    }, {
      "referenceId": "another-memorable-name",
      "allowedAction": "sign",
      "controller": "did:example:1234",
      "invocationTarget": {
        "type": "Multikey",
        "proofPurpose": "assertionMethod"
      }
    }],
    challenge: "111112b24-63d9-11ea-b99f-4f66f3e4f81a"
  }]
}

3.4.5 クエリ内の論理演算

Verifiable Presentation Requests では、情報の構造化と取得は論理演算の使用に依存します。 "AND" および "OR" 演算は、目的のデータへの経路を定義する上で重要な役割を果たします。

3.4.5.1 トップレベル クエリ("AND" 演算)

要求構造の最上位レベルでは、各クエリの group プロパティが同じ値に設定されている場合、 異なる種類のクエリは "AND" 演算として処理されることが期待されます。

この例では、group フラグが certification に設定された 2 つのクエリがあります。これは "AND" 演算となり、要求を満たすにはこれら両方の条件を 満たす必要があることを示します。

10: トップレベル・クエリを使用して 複数のクレデンシャルを一度に要求する
{
  "query": [{
    "type": "QueryByExample",
    "group": "certification",
    // query details ...
  },
  // "AND"
  {
    "type": "DigitalCredentialQueryLanguage",
    "group": "certification",
    // query details ...
  }]
}
3.4.5.2 ネストされたクエリ ("OR" 演算)

特定のクエリ型内では、group を指定しないか、互いに異なる group 値を指定することで、"OR" 演算を適用できます。

11: いずれかが一致すれば成功する 代替クレデンシャルのクエリ
{
  "query": [{
    "type": "QueryByExample",
    "group": "college-degree",
    // query details ...
  },
  // "OR"
  {
    "type": "DigitalCredentialQueryLanguage",
    "group": "job-experience",
    // query details ...
  }]
}

3.5 提示

Verifiable Credential を提示するために、以下の API が定義されています。

エンドポイント 説明
POST /credentials/derive クレデンシャルを導出し、それを応答本文で返します。
GET /presentations 提示または検証可能な提示の一覧を取得します
POST /presentations 提示を作成し、それを応答本文で返します。
GET /presentations 提示または検証可能な提示の一覧を取得します
POST /presentations 提示を作成し、それを応答本文で返します。
GET /presentations/{id} ID によって提示または検証可能な提示を取得します
DELETE /presentations/{id} ID によって提示または検証可能な提示を削除します
POST /exchanges/ エラー: API エンドポイントが定義されていません - /exchanges/
POST /exchanges/{exchangeId} エラー: API エンドポイントが定義されていません - /exchanges/{exchangeId}

URL パス値 exchange-id はサーバーにとって意味を持ちますが、 クライアントにとっては不透明です。一部のサーバー実装がたまたま人間可読な値を使用する場合があっても、 クライアントは人間可読な値に意味を割り当てないよう強く推奨されます。

3.5.1 クレデンシャルの導出

POST /credentials/derive - クレデンシャルを導出し、それを応答本文で返します。

/credentials/derive エンドポイントは、POST を受信する際に以下のスキーマを使用します。

プロパティ 説明
verifiableCredential [object] 以下の形式のオブジェクト:
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
options [object] 導出されたクレデンシャルがどのように作成されるかを指定するためのオプション。 これは以下の形式のオブジェクトで MUST あります。
selectivePointers [array]
選択的に開示される情報を指定する JSON ポインターの配列。 selectivePointers 配列内の各項目は文字列で MUST あります。

/credentials/derive エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
201 クレデンシャルが正常に導出されました。
content-type: application/json
以下の形式のオブジェクト:
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
400 無効な要求

3.5.2 提示の作成

注記: 提示のメディア型

application/vp 以外のメディア型、たとえば application/vp+jwt で提示を作成するために、 応答で EnvelopedVerifiablePresentation を返すことができます。

POST /presentations - 提示を作成し、それを応答本文で返します。

/presentations エンドポイントは、POST を受信する際に以下のスキーマを使用します。

プロパティ 説明
presentation [object] 証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の オブジェクトで MUST あります。
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は、以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
options [object] DataIntegrityProof がどのように作成されるかを指定するためのオプション。 これは以下の形式のオブジェクトで MUST あります。
type [string]
証明の型。既定値は 'DataIntegrityProof'。
cryptosuite [string]
証明の暗号スイート。
verificationMethod [string]
証明に使用される verificationMethod の URI。省略された場合、 既定の検証メソッドが使用されます。
proofPurpose [string]
証明の目的。既定値は 'assertionMethod'。
created [string]
証明の日付と時刻(最大精度は秒)。既定値は現在のシステム時刻。
challenge [string]
証明の要求当事者によって提供されるチャレンジ。例: 6e62f66e-67de-11eb-b490-ef3eeefa55f2
domain [string]
証明の意図された有効ドメイン。例: website.example

/presentations エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
201 提示が正常に作成されました!
content-type: application/json
以下の形式のオブジェクト:
verifiablePresentation [object]
以下の形式のオブジェクトのいずれか。
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを 自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式の オブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
または、エンベロープされた検証可能な提示を表現するために使用される オブジェクト。これは以下の形式のオブジェクトで MUST あります。
@context [array]
エンベロープされた検証可能な提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
これは、エンベロープ化セキュリティ方式を使用して保護された 検証可能な提示を表す "data:" スキーム URL [RFC2397] で MUST あります。
type [string]
これは EnvelopedVerifiablePresentation で MUST あります。
400 無効な入力です!

3.5.3 提示の取得

GET /presentations - 提示または検証可能な提示の一覧を取得します

/presentations エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 提示が取得されました
content-type: application/json
配列内の各項目は、証明を持たない JSON-LD Verifiable Presentation で MUST あります。これは以下の形式のオブジェクトで MUST あります。
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
または以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
400 Bad Request
401 認可されていません
410 Gone! ここにデータはありません

3.5.4 特定の 提示の取得

GET /presentations/{id} - ID によって提示または検証可能な提示を取得します

/presentations/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
200 クレデンシャルが取得されました
content-type: application/json
証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の オブジェクトで MUST あります。
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
または以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを設定できない ユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
400 Bad Request
401 認可されていません
404 提示が見つかりません
410 Gone! ここにデータはありません

3.5.5 特定の 提示の削除

DELETE /presentations/{id} - ID によって提示または検証可能な提示を削除します

/presentations/{id} エンドポイントは、DELETE を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
202 提示が削除されました - ソフト削除と処理時間が想定されるため、 これは既定で 202 です
400 Bad Request
401 認可されていません
404 提示が見つかりません
410 Gone! ここにデータはありません

3.6 ワークフローと交換

ワークフローは、 信頼境界をまたいで二者間で検証可能なクレデンシャルを交換するための、 特定の一連のステップを定義します。各ステップには、検証可能なクレデンシャルの 発行、検証、送信、および/または提示が関与する可能性があります。ワークフローは、 線形なステップ列と、分岐ロジックや反復ステップを含むより複雑なパターンの両方を サポートするよう設計されており、関係する当事者間の高度なインタラクションを可能にします。 VC API ワークフローの例には、以下が含まれますが、これらに限定されません。

ワークフロー・インスタンスは、たとえばコーディネーター Web サイトで使用するために、 管理者によって作成されることが期待されます。ワークフロー・インスタンスは、 ワークフロー・サービスの /workflows エンドポイントに HTTP POST を実行することで作成されます。 HTTP 要求本文には、ワークフロー・インスタンスの構成が含まれます。これには、 ワークフローを定義するステップに関する情報や、検証可能なクレデンシャルを発行するために 使用されるクレデンシャル・テンプレートが含まれますが、これらに限定されません。 ワークフローを定義するステップもテンプレートである場合があり、追加の柔軟性を可能にします。 ワークフローが検証可能なクレデンシャルの発行、または提示もしくはクレデンシャルの検証を伴う場合、 ワークフロー・インスタンス構成には、1 つ以上の発行者サービスおよび/または検証サービスを使用するための 認可ケイパビリティを含めることができます。

ワークフロー・インスタンスが存在すると、交換と呼ばれる特定の ワークフロー・インタラクションを作成および照会する認可を、コーディネーターに与えることができます。

交換は、指定されたワークフローに基づく特定のインタラクションを表します。 このインタラクションは、交換クライアントとワークフロー・サービスの間で行われます。 交換は一時的なものであることが期待され、インタラクションが完了するまでの間だけ存在します。 ワークフロー・サービスは、各交換について、その交換が保留中、アクティブ、または完了済みであるか、 ワークフロー内の現在のステップ、ワークフロー固有の変数とデータ、および交換の実行中に 受信された検証可能な提示とクレデンシャルなどの状態情報を保存します。実装者は、 Section 3.6.3 交換の作成 で定義される予約済み変数に加えて、実装で望む任意の変数を自由に使用できます。 ワークフロー内のステップ数に技術的な制限はありませんが、実装者はバグを防ぐために、 既定の最大ステップ数を強制したい場合があります。

発行者、検証者、または保持者コーディネーターは、交換を作成する責任を負います。 コーディネーターは、ワークフロー・サービス上で、選択したワークフローの /exchanges サブパスに HTTP POST を実行することで交換を作成します。 HTTP 要求本文には、交換の有効期限日時と、特定の交換についてワークフローのテンプレートに 入力するために使用される任意の変数が含まれます。要求本文には、この API 以外の追加プロトコルを 使用して交換を実行できるようにする構成オプションを含めることもできます。交換が作成されると、 交換を識別し、それとのインタラクションを可能にする交換 URL がコーディネーターに返されます。

交換 URL は、交換クライアントが交換を開始できるように、そのクライアントに渡されます。 交換 URL はコーディネーターに渡され、その後コーディネーターが交換クライアントに提供しますが、 実際の交換は交換クライアントとワークフロー・サービスの間で実行されることに注意してください。 交換 URL を交換クライアントに提供した後、コーディネーターは関与しません。明確にすると、 コーディネーターは、交換自体を実行する必要があるユースケースでは、 依然として自身の交換クライアントを使用できます。

交換を開始するには、交換 URL 以外の認可は必要ありません。ワークフロー・サービスの実装によっては、 交換 URL はケイパビリティ URL(つまり、URL は推測不可能な秘密であり、その URL を与えられた者だけが 交換を開始できる)である場合もあります。交換の基になるワークフローが、交換 URL の保有以外に 追加の認可を必要とする場合、それは交換の開始時ではなく、交換中に取得されます。

交換 URL は、交換が進行するにつれて現在の状態を照会し、ワークフロー・サービスが保存した 交換に関連する情報を取得するために、コーディネーターによって使用することもできます。 この方法で交換を照会するには、コーディネーターが持つことが期待され、交換クライアントは持たない 追加の認可が必要です。

交換 URL がコーディネーターから交換クライアントへどのように送信されるかは、 この仕様の範囲外です。交換 URL をクライアントと共有する既知の仕組みには、 Credential Handler API(別名 CHAPI)、QR コード、またはユニバーサルリンクが含まれます。

交換は、この API の交換プロトコルに加えて、他のプロトコルを使用しても実行可能であるように 設計されています。たとえば、交換は OID4VCI、OID4VP、DIDComm、および交換プロトコルのいずれでも 実行可能である可能性があります。サポートされるプロトコルは、交換の基になるワークフローの複雑さと、 交換が作成されたときにコーディネーターが提供したオプションに依存します。

交換クライアントは、交換 URL を受け取った方法と互換性のあるプロトコルを使用して、 交換を開始することが期待されます。たとえば、この API プロトコルを使用すべきであることを示す プロトコル識別子とともに、交換 URL が CHAPI 経由で提供されている場合があります。あるいは、 OID4VCI クレデンシャル・オファー内の "credential_issuer" として、または OID4VP 認可要求の "client_id" として交換 URL が含まれ、それぞれ OID4VCI または OID4VP を使用すべきであることを 示す場合があります。この節では、交換クライアントがこの API を使用して交換とやり取りする方法に焦点を当てます。 OID4VCI、OID4VP、DIDComm などの他のプロトコルと交換を組み合わせる方法については、 付録 TBD を参照してください。

この API プロトコルを使用して実行される交換には、HTTP 上で要求本文および応答本文として送信される メッセージが関与します。各メッセージは、以下のプロパティと値を 0 個以上含む単純な JSON オブジェクトで 構成されます。

カスタムのプロパティと値も含まれる場合がありますが、それらを認識しない実装では エラーを引き起こすことが期待されます。

この API プロトコルを使用して交換を開始するには、交換クライアントは JSON オブジェクトを 要求本文として送信する HTTP POST を実行します。最も単純な場合、クライアントが交換に対して 独自の制約を持たない場合、すなわち他方の当事者から要求するものが何もない場合、 JSON オブジェクトは空({})です。ワークフロー・サービスは、応答本文で 自身の JSON オブジェクトを返します。

その応答オブジェクトが空の場合、交換は完了しており、交換クライアントから要求されるものも、 交換クライアントへ提供されるものもありません。オブジェクトに verifiablePresentationRequest が含まれる場合、交換はまだ完了しておらず、 関連付けられた検証可能な提示要求の内容で指定される追加情報が要求されています。 オブジェクトに verifiablePresentation が含まれる場合、交換クライアントを操作する 保持者に発行された検証可能なクレデンシャルや、交換クライアントの要求に基づく交換サーバーの 運用者に関する情報を含む検証可能なクレデンシャルなど、何らかの情報が提供されています。 オブジェクトに redirectUrl が含まれる場合、交換は完了しており、ワークフロー・サービスは、 クライアントが別の形式でインタラクションを継続するために別の場所へ進むことを推奨しています。

多くの検証可能なクレデンシャルのユースケースは、これらの基本プリミティブを使用して実装できます。 交換のいずれの当事者も、検証可能な提示を要求し、信頼を確立するため、および/または 認可ケイパビリティを取得するために必要となる 1 つ以上の検証可能なクレデンシャルを提供できます。 また、いずれの当事者も、自身が保持する、または自身が発行したクレデンシャルを提示できます。 特定のワークフローは、特定の提示とクレデンシャルを期待し、期待される情報の流れからの逸脱を 拒否するよう構成できます。ワークフロー・サービスが特定のメッセージを受け入れられないと判断した場合、 4xx HTTP ステータス・メッセージと、そのエラーに関する情報を表す JSON オブジェクトで 応答することにより、エラーを発生させます。

交換の設計アプローチは階層化されています。これは、最小限の通信メッセージ層と、 ほとんどのユースケースを上位層の特定の検証可能な提示要求および検証可能なクレデンシャルを介して 実装できるようにする一連のプリミティブを提供することを目的としています。 特定の検証可能な提示要求と検証可能なクレデンシャルを使用するワークフローと交換の例については、 後続の付録を参照してください。

注記: ワークフロー・ステップ とクレデンシャルの例

ステップとクレデンシャル・テンプレートの最小限の実用例、およびいくつかの より複雑なワークフロー・テンプレートは、付録 ワークフロー・ステップとテンプレートの例にあります。

交換との特定のインタラクションは短命であることが期待されますが、 より長い、または複数段階のインタラクションを可能にするために他の仕組みを使用できます。 他のインタラクションの仕組みの例には、SMS、メール、Web 通知、または電話が含まれます。 このアプローチにより、デジタル・ウォレットの実装が簡素化され、この API 内で再発明することなく 既存の仕組みを再利用できます。Web またはネイティブ・プラットフォームは、アプリケーション (Web ブラウザーなど)または他のプラットフォーム機能を通じて追加のインタラクションを可能にすることが 期待されます。たとえば、非同期発行では、保持者がクレデンシャルを要求しますが、処理を待ちます。 このような場合、システム・コンポーネント(発行者コーディネーターなど)は、この API の外部の仕組みを 使用して、クレデンシャルの収集準備ができたときに保持者へ通知します。

信頼境界をまたぐ必要があるクレデンシャルのユースケースでワークフローと交換を使用するために、 以下の API が定義されています。

エンドポイント 説明
POST /workflows 新しいワークフローを作成し、応答ヘッダーでワークフロー・メタデータの場所を返します。
GET /workflows/{localWorkflowId} 既存のワークフローの構成を取得し、応答本文で返します。
POST /workflows/{localWorkflowId}/exchanges 新しい交換を作成し、応答ヘッダーで交換メタデータの場所を返します。
GET /workflows/{localWorkflowId}/exchanges/{localExchangeId} 既存の交換の状態を取得し、応答本文で返します。
POST /workflows/{localWorkflowId}/exchanges/{localExchangeId} 交換に参加します。空の本文を POST すると、交換を開始するか、次のステップを完了するために 交換が期待しているものを返します。Verifiable Presentation Request を POST すると、 4xx エラー、または以下のいずれか、すなわちクライアントの要求に適合する Verifiable Presentation または Verifiable Presentation Request が返されます。 Verifiable Presentation が送信される場合、交換を継続するために追加の Verifiable Presentation Request も送信される場合があります。

ワークフローおよび交換 API において、"local" ID は、サービス・インスタンスに対してローカルな ID を指します。 言い換えると、exchangeId または workflowId は完全修飾 URL を指す一方、 localExchangeId または localWorkflowId は URL パス内の特定の要素を指します。

3.6.1 ワークフローの作成

POST /workflows - 新しいワークフローを作成し、応答ヘッダーでワークフロー・メタデータの場所を 返します。

/workflows エンドポイントは、POST を受信する際に以下のスキーマを使用します。

プロパティ 説明
id [string] 作成されるワークフローに使用される ID。ID を渡すことは OPTIONAL です。
initialStep [string] 上記の集合のうち、交換が開始されるステップ。initialStep を渡すことは REQUIRED です。
controller [string] インスタンスのルート・コントローラーを指定する OPTIONAL なプロパティ。 これは、オブジェクト・ケイパビリティに依存する Authorization Capabilities (ZCAPs) のような認可メカニズムをサポートするシステムで使用できます。 この値は、authorization プロパティと組み合わせて使用し、 他の認可メカニズムを同時に許可できます。
authorization [object] OAuth2 構成など、エンドポイントの認可スキーム情報を指定する OPTIONAL なプロパティ。 これは以下の形式のオブジェクトで MUST あります。
oauth2 [object]
OAuth2 構成。これは以下の形式のオブジェクトで MUST あります。
issuerConfigUrl [string]
OAuth2 発行者構成 URL。
credentialTemplates [array] 各項目が以下の形式のオブジェクトで MUST ある配列。
id [string]
テンプレートの ID。
type [string]
テンプレートの型。
template [string]
テンプレートそのもの。
steps [object] ワークフロー上で交換を完了するために必要な 1 つ以上のステップ。 steps オブジェクトを渡すことは REQUIRED です。キーは 1 つ以上のステップ名であり、 各 STEP_NAME はステップの名前(request-employee-id など)に置き換えられ、 値はステップ構成です。これは以下の形式のオブジェクトで MUST あります。
STEP_NAME [object]
テンプレートが使用されない場合に含めるステップ・データのいずれか。 これは以下の形式のオブジェクトで MUST あります。
createChallenge [boolean]
交換が、zcap を持つ VCALM 検証者サービスを介してチャレンジ管理を 処理するよう指示する任意のステップ指令。
verifiablePresentationRequest [object]
Verifiable Presentation Request。これは以下の形式のオブジェクトで MUST あります。
query [array]
要求者によって送信される 1 つ以上のクエリの集合。 query 配列内の各項目は以下の形式のオブジェクトで MUST あります。
type [array]
クエリの型。type 配列内の各項目は 文字列で MUST あります。
credentialQuery [object]
QueryByExample クエリの場合、クレデンシャル要求の詳細を指定します。 これは以下の形式のオブジェクトで MUST あります。
reason [string]
クレデンシャルが要求されている理由についての 人間可読な説明。
example [object]
オブジェクト
acceptedIssuers [array]
要求されたクレデンシャルに対して受け入れられる発行者。 acceptedIssuers 配列内の各項目は 以下の形式のオブジェクトで MUST あります。
issuer [string]
acceptedCryptosuites [array]
検証者が受け入れる暗号証明スイート。 各要素は、Data Integrity 暗号スイート名、または レガシー用の Ed25519Signature2020 を参照する cryptosuite プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用され、 暗号スイート名として解釈されます)。これにより、 保持者は適切な証明形式を選択できます。 このプロパティは、エンベロープされたクレデンシャルにのみ 適用される acceptedEnvelopes とは独立して MAY 使用できます。 acceptedCryptosuites 配列内の各項目は undefined: で MUST あります
acceptedEnvelopes [array]
検証者が受け入れるエンベロープ形式。 各要素は、エンベロープ用のメディア型を参照する mediaType プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用され、 メディア型として解釈されます)。これにより、保持者は 既定の Data Integrity 形式以外の形式で クレデンシャルを提供できます。このプロパティは、 受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ適用される acceptedCryptosuites とは独立して MAY 使用できます。 acceptedEnvelopes 配列内の各項目は undefined: で MUST あります
challenge [string]
リプレイ攻撃を防止することを意図して、要求者によって提供されるチャレンジ。 通常、Verifiable Presentation 応答に含められることが期待されます。
domain [string]
リプレイ攻撃を防止することを意図して、要求者によって提供されるドメイン。 通常、Verifiable Presentation 応答に含められることが期待されます。
interact [array]
サーバーがサポートするインタラクション・メカニズムのリスト。 interact 配列内の各項目は以下の形式のオブジェクトで MUST あります。
service [object]
Verifiable Presentation Request への応答を受信できる、 サーバーがサポートするサービス。これは以下の形式のオブジェクトで MUST あります。
type [array]
サービスの型。type 配列内の各項目は 文字列で MUST あります。
serviceEndpoint [string]
Verifiable Presentation Request に応答する目的で、 サービスとやり取りするために利用できる URL。
verifiablePresentation [object]
以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の 各項目は以下の形式のオブジェクトで MUST あります。
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを 自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか。
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式の オブジェクトで MUST あります。
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
redirectUrl [string]
別の場所でインタラクションを継続するために使用できる、 クライアントへ送信する URL。redirectUrl を渡すことは OPTIONAL です。
callback [object]
このステップの実行後に呼び出されるコールバック。これは以下の形式の オブジェクトで MUST あります。
url [string]
コールバック・データを受信する URL。
issueRequests [array]
issueRequests 配列内の各項目は
{
  "required": [
    "credentialTemplateId"
  ]
}
または
{
  "required": [
    "credentialTemplateIndex"
  ]
}
MUST あります。
presentationSchema
提示に対して実行される妥当性確認を記述する JSON Schema のいずれか。 これは以下の形式のオブジェクトで MUST あります。
type [string]
値は JsonSchemaMUST あります。
jsonSchema [object]
オブジェクト
または、現在のステップで提示を妥当性確認するときに使用する 代替の提示スキーマ形式。特定の提示スキーマ型には追加プロパティが 期待されますが、この仕様の範囲外です。これは以下の形式のオブジェクトで MUST あります。
type [string]
提示を妥当性確認するときに使用する提示スキーマ・メカニズムの型。
verifyPresentationResponseSchema
提示の検証結果に対して実行される妥当性確認を記述する JSON Schema のいずれか。 これは以下の形式のオブジェクトで MUST あります。
type [string]
値は JsonSchemaMUST あります。
jsonSchema [object]
オブジェクト
または、現在のステップで提示を検証した結果に使用する 代替の提示スキーマ形式。特定の提示スキーマ型には追加プロパティが 期待されますが、この仕様の範囲外です。これは以下の形式のオブジェクトで MUST あります。
type [string]
提示の検証結果を妥当性確認するときに使用する 提示スキーマ・メカニズムの型。
nextStep [string]
シーケンス内の次のステップ名。nextStep を渡すことは OPTIONAL です。 このフィールドは最終ステップ構成には存在しては MUST NOT なりません。
openId [object]
以下のいずれか
{
  "required": [
    "createAuthorizationRequest"
  ],
  "not": {
    "required": [
      "authorizationRequest"
    ]
  }
}
または
{
  "required": [
    "authorizationRequest"
  ],
  "not": {
    "required": [
      "createAuthorizationRequest"
    ]
  }
}
または以下の形式のオブジェクト:
clientProfiles [object]
オブジェクト
または以下の形式のオブジェクト:
stepTemplate [object]
ワークフロー・ステップのテンプレート。これか他のステップ・データの いずれかが存在しなければなりませんが、両方の集合が存在してはなりません。 これは以下の形式のオブジェクトで MUST あります。
type [string]
テンプレートの型。
template [string]
ステップ・テンプレート。

/workflows エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。

応答 本文
201 ワークフローが正常に作成されました(データあり)
204 ワークフローが正常に作成されました(データなし)
400 無効な入力
401 認可されていません
500 内部エラー

ワークフローには、ステップ、クレデンシャル・テンプレート、および認可に関する情報を 含めることができます。場合によっては、ワークフローがその構成内の異なる箇所 (通常はクレデンシャル・テンプレート内)で予約済みの results 変数を 参照することもあります。この変数は、交換の過程を通じてワークフロー・サービスが クライアントから受信するデータを保持します。以下は、DID Authentication ステップと クレデンシャル配信ステップを含む基本的なワークフロー構成です。

issueRequests 配列を含むステップには、1 つ以上の発行要求オブジェクトが含まれます。 各発行要求オブジェクトは、使用するクレデンシャル・テンプレートを、その識別子 (credentialTemplateId)またはワークフローの credentialTemplates 配列内のインデックス(credentialTemplateIndex)のいずれかで 識別します。発行要求オブジェクトは、クレデンシャル・テンプレートを評価するときに使用される値を 提供するために、variables プロパティを MAY 含めることもできます。 既定では、各発行要求の結果は、同じステップで交換クライアントに送信される 検証可能な 提示に含まれます。発行要求オブジェクトは、任意の result プロパティを MAY 含めることができ、 その値は、交換の variables オブジェクト内のトップレベル変数の名前、 または交換の variables オブジェクト内の任意の変数への JSON ポインターの いずれかで MUST あり、発行要求の結果を保存する場所を識別します。 これにより、後続のステップが保存された結果を参照できる、または交換が終了し、 交換状態にアクセスできる当事者が、その結果を別の交換やその他の仕組みで使用するために 取得できるため、より大きな合成性が可能になります。

12: 基本的なワークフロー
{
  "id": "9fd3bc6d-4a04-4b3d-a983-3482d0586626",
  "initialStep": "didAuthRequest",
  "steps": {
    "didAuthRequest": {
      "createChallenge": true,
      "verifiablePresentationRequest": {
        "query": {
          "type": "DIDAuthentication",
          "acceptedMethods": [
            {
              "method": "key"
            },
            {
              "method": "web"
            }
          ],
          "acceptedCryptosuites": [
            {
              "cryptosuite": "eddsa-rdfc-2022"
            },
            {
              "cryptosuite": "ed25519-2020"
            }
          ]
        },
        "domain": "https://issuer.example.com"
      },
      "nextStep": "credentialDelivery"
    },
    "credentialDelivery": {
      "issueRequests": [
        {
          "credentialTemplateId": "caffb919-053a-4bfa-beba-80567904f842",
          "variables": "sampleAchievementCredential"
        }
      ]
    }
  },
  "credentialTemplates": [
    {
      "id": "caffb919-053a-4bfa-beba-80567904f842",
      "type": "jsonata",
      "template": "{
        \"credential\": {
          \"@context\": [
            \"https://www.w3.org/ns/credentials/v2\",
            \"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json\",
            \"https://purl.imsglobal.org/spec/ob/v3p0/extensions.json\"
          ],
          \"id\": sampleAchievementCredential.id,
          \"type\": [\"VerifiableCredential\", \"AchievementCredential\"],
          \"issuer\": {
            \"type\": [\"Profile\"],
            \"name\": \"Example Issuer\",
            \"image\": {
              \"type\": \"Image\",
              \"id\": \"https://issuer.example.com/logo.png\"
            }
          },
          \"awardedDate\": sampleAchievementCredential.awardedDate,
          \"validFrom\": sampleAchievementCredential.validFrom,
          \"name\": \"Sample Achievement\",
          \"credentialSubject\": {
            \"id\": results.didAuthRequest.verifiablePresentation.holder,
            \"type\": \"AchievementSubject\",
            \"name\": sampleAchievementCredential.credentialSubject.name,
            \"achievement\": {
              \"id\": sampleAchievementCredential.credentialSubject.achievement.id,
              \"type\": [\"Achievement\"],
              \"achievementType\": sampleAchievementCredential.credentialSubject.achievement.achievementType,
              \"name\": sampleAchievementCredential.credentialSubject.achievement.name,
              \"description\": sampleAchievementCredential.credentialSubject.achievement.description,
              \"alignment\": sampleAchievementCredential.credentialSubject.achievement.alignment
            }
          }
        }
      }"
    }
  ],
  "controller": "did:web:issuer.example.com"
}

ステップは、そのステップで使用される検証可能な 提示を明示的に表現するために、verifiablePresentationMAY 含めることができます。この提示は、交換内の他の変数を介して構成でき、 そのステップ中に(issueRequests に従って)発行される可能性のある追加の 検証可能な クレデンシャルで拡張することもできます。これは、特定の 検証可能な 提示のバージョンが必要なユースケース、特定のサブタイプの 検証可能な 提示が必要なユースケース、または特定の 検証可能な 提示の内容が必要なユースケースをサポートします。これには、ワークフロー・ステップで 配信されるべき、以前に帯域外で発行された検証可能な クレデンシャルも含まれます。

ステップは、別の場所でインタラクションを継続するために使用できる URL を クライアントへ送信することを指定するために、redirectUrlMAY 含めることができます。 このユースケースの 1 つは、交換が完了した後に、交換クライアントのユーザーを コーディネーター Web サイトへ戻すことです。別のユースケースは、クライアントが Web ブラウザーへ移動することを要求せずに、サーバーが継続中のインタラクション中に カスタム・ビジネスルールを実装できるようにする インタラクション URLを返すことです。 たとえば、最初の交換がユーザーから情報を要求し、その後 redirectUrl を介してインタラクション URLを返す場合があります。 クライアント(たとえばデジタル・ウォレット)は、それがインタラクション URL (たとえば URL が ?iuv=1 を使用する)であると判断して取得でき、 その結果、インタラクション・サーバーはカスタム・ビジネスロジックを実行し、 その後インタラクションを継続するための別の交換を含むプロトコル・オブジェクトを返します。

一部のワークフローでは、その 1 つ以上のステップでカスタム変数を参照する必要があります。 この場合、コーディネーターは交換を作成するときに、その変数に適切な値を提供する必要があります。 以下は、テンプレート化された DID Authentication ステップを持つワークフロー構成の例です (didAuthRequest ステップで参照されている verifiablePresentationRequest 変数と callbackUrl 変数に注意してください)。

13: テンプレート化されたワークフロー
{
  "id": "9fd3bc6d-4a04-4b3d-a983-3482d0586626",
  "initialStep": "didAuthRequest",
  "steps": {
    "didAuthRequest": {
      "stepTemplate": {
        "type": "jsonata",
        "template": "{
          "createChallenge": true,
          "verifiablePresentationRequest": verifiablePresentationRequest,
          "callback": {
            "url": callbackUrl
          },
          "nextStep": "credentialDelivery"
        }"
      }
    },
    "credentialDelivery": {
      "issueRequests": [
        {
          "credentialTemplateId": "caffb919-053a-4bfa-beba-80567904f842",
          "variables": "sampleAchievementCredential"
        }
      ]
    }
  },
  "credentialTemplates": [
    {
      "id": "caffb919-053a-4bfa-beba-80567904f842",
      "type": "jsonata",
      "template": "{
        \"credential\": {
          \"@context\": [
            \"https://www.w3.org/ns/credentials/v2\",
            \"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json\",
            \"https://purl.imsglobal.org/spec/ob/v3p0/extensions.json\"
          ],
          \"id\": sampleAchievementCredential.id,
          \"type\": [\"VerifiableCredential\", \"AchievementCredential\"],
          \"issuer\": {
            \"type\": [\"Profile\"],
            \"name\": \"Example Issuer\",
            \"image\": {
              \"type\": \"Image\",
              \"id\": \"https://issuer.example.com/logo.png\"
            }
          },
          \"awardedDate\": sampleAchievementCredential.awardedDate,
          \"validFrom\": sampleAchievementCredential.validFrom,
          \"name\": \"Sample Achievement\",
          \"credentialSubject\": {
            \"id\": results.didAuthRequest.verifiablePresentation.holder,
            \"type\": \"AchievementSubject\",
            \"name\": sampleAchievementCredential.credentialSubject.name,
            \"achievement\": {
              \"id\": sampleAchievementCredential.credentialSubject.achievement.id,
              \"type\": [\"Achievement\"],
              \"achievementType\": sampleAchievementCredential.credentialSubject.achievement.achievementType,
              \"name\": sampleAchievementCredential.credentialSubject.achievement.name,
              \"description\": sampleAchievementCredential.credentialSubject.achievement.description,
              \"alignment\": sampleAchievementCredential.credentialSubject.achievement.alignment
            }
          }
        }
      }"
    }
  ],
  "controller": "did:web:issuer.example.com"
}

openId オプション、特に createAuthorizationRequestauthorizationRequest の値については、開発者が OID4VP Authorization Request が どのようなものか理解しやすいように、以下の例を提供します。

14: OID4VP Authorization Request
{
  "response_type": "vp_token",
  "presentation_definition": {
    "id": "f1bd224a-0fed-469a-b64a-dad7cf63fd98",
    "input_descriptors": [
      {
        "id": "77d50c71-95ef-442c-a372-f32e17634fab",
        "constraints": {
          "fields": [
            {
              "path": [
                "$['@context']"
              ],
              "filter": {
                "type": "array",
                "contains": {
                  "type": "string",
                  "const": "https://www.w3.org/ns/credentials/v2"
                }
              }
            },
            {
              "path": [
                "$['type']"
              ],
              "filter": {
                "type": "array",
                "contains": {
                  "type": "string",
                  "const": "VerifiableCredential"
                }
              }
            },
            {
              "path": [
                "$['credentialSubject']['name']"
              ],
              "filter": {
                "type": "string"
              }
            }
          ]
        },
        "purpose": "We require a name credential to display your name when you post messages."
      }
    ]
  },
  "response_mode": "direct_post",
  "client_metadata": {
    "vp_formats_supported": {
      "ldp_vc": {
        "proof_type_values": [
          "DataIntegrityProof",
          "Ed25519Signature2020"
        ],
        "cryptosuite_values": [
          "ecdsa-rdfc-2019",
          "eddsa-rdfc-2022"
        ]
      }
    },
    "vp_formats": {
      "jwt_vp": {
        "alg": [
          "EdDSA",
          "Ed25519",
          "ES256",
          "ES384"
        ]
      },
      "jwt_vp_json": {
        "alg": [
          "EdDSA",
          "Ed25519",
          "ES256",
          "ES384"
        ]
      },
      "di_vp": {
        "proof_type": [
          "ecdsa-rdfc-2019",
          "eddsa-rdfc-2022",
          "Ed25519Signature2020"
        ]
      },
      "ldp_vp": {
        "proof_type": [
          "ecdsa-rdfc-2019",
          "eddsa-rdfc-2022",
          "Ed25519Signature2020"
        ]
      }
    }
  },
  "client_id": "https://some.example/workflows/z1A7ojitBF3pGpVzW17MgU7zm/exchanges/z1ACKwiBiXmuGjpKAdKMpBZXB/openid/client/authorization/response",
  "client_id_scheme": "redirect_uri",
  "response_uri": "https://some.example/workflows/z1A7ojitBF3pGpVzW17MgU7zm/exchanges/z1ACKwiBiXmuGjpKAdKMpBZXB/openid/client/authorization/response",
  "nonce": "z1ACKwiBiXmuGjpKAdKMpBZXB"
}

3.6.2 ワークフロー構成の取得

GET /workflows/{localWorkflowId} - 既存のワークフローの構成を取得し、応答本文で返します。

/workflows/{localWorkflowId} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
200 ワークフロー構成が取得されました!
content-type: application/json
ワークフローに関する情報を含むオブジェクト。これは以下の形式のオブジェクトで MUST あります:
id [string]
作成されるワークフローに使用される ID。ID を渡すことは OPTIONAL です。
initialStep [string]
上記の集合のうち、交換が開始されるステップ。intialStep を渡すことは REQUIRED です。
controller [string]
インスタンスのコントローラー。controller を渡すことは OPTIONAL です。
authorization [object]
認可スキーム情報(例: OAuth2 構成)。 authorization を渡すことは OPTIONAL です。これは以下の形式の オブジェクトで MUST あります:
oauth2 [object]
OAuth2 構成。これは以下の形式のオブジェクトで MUST あります:
issuerConfigUrl [string]
OAuth2 発行者構成 URL。
credentialTemplates [array]
クレデンシャル発行用の 1 つ以上のテンプレート。 template 文字列は、クレデンシャル・テンプレートを保持する credential フィールドと、(任意で)重要なクレデンシャル発行 パラメーターを保持する options フィールドを含むオブジェクトに レンダリングされるべきです(これは POST /credentials/issue に送信される 要求本文の形式です)。credentialTemplates を渡すことは OPTIONAL です。 credentialTemplates 配列内の各項目は、以下の形式のオブジェクトで MUST あります:
type [string]
テンプレートの型。
template [string]
テンプレートそのもの。
steps [object]
ワークフロー上で交換を完了するために必要な 1 つ以上のステップ。 キーは 1 つ以上のステップ名であり、各 STEP_NAME は ステップの名前(request-employee-id など)に置き換えられ、 値はステップ構成です。これは以下の形式のオブジェクトで MUST あります:
STEP_NAME [object]
テンプレートが使用されない場合に含めるステップ・データのいずれか。 これは以下の形式のオブジェクトで MUST あります:
createChallenge [boolean]
交換が、zcap を持つ VCALM 検証者サービスを介して チャレンジ管理を処理するよう指示する任意のステップ指令。
verifiablePresentationRequest [object]
Verifiable Presentation Request。これは以下の形式の オブジェクトで MUST あります:
query [array]
要求者によって送信される 1 つ以上のクエリの集合。 query 配列内の各項目は、 以下の形式のオブジェクトで MUST あります:
type [array]
クエリの型。 type 配列内の各項目は 文字列で MUST あります。
credentialQuery [object]
QueryByExample クエリの場合、 クレデンシャル要求の詳細を指定します。 これは以下の形式のオブジェクトで MUST あります:
reason [string]
クレデンシャルが要求されている理由についての 人間可読な説明。
example [object]
オブジェクト
acceptedIssuers [array]
要求されたクレデンシャルに対して 受け入れられる発行者。 acceptedIssuers 配列内の各項目は、以下の形式の オブジェクトで MUST あります:
issuer [string]
acceptedCryptosuites [array]
検証者が受け入れる暗号証明スイート。 各要素は、Data Integrity 暗号スイート名 またはレガシー用の Ed25519Signature2020 を参照する cryptosuite プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用でき、 暗号スイート名として解釈されます)。これにより、 保持者は適切な証明形式を選択できます。 このプロパティは、 acceptedEnvelopes とは独立して MAY 使用できます。 acceptedEnvelopes は、 エンベロープされたクレデンシャルにのみ適用されます。 acceptedCryptosuites 配列内の各項目は undefined: で MUST あります。
acceptedEnvelopes [array]
検証者が受け入れるエンベロープ形式。 各要素は、エンベロープ用のメディア型を参照する mediaType プロパティを持つ オブジェクトで SHOULD あります(後方互換性のため、文字列値も MAY 使用でき、 メディア型として解釈されます)。これにより、 保持者は既定の Data Integrity 形式以外の形式で クレデンシャルを提供できます。このプロパティは、 受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ適用される acceptedCryptosuites とは独立して MAY 使用できます。 acceptedEnvelopes 配列内の各項目は undefined: で MUST あります。
challenge [string]
リプレイ攻撃を防止することを意図して、 要求者によって提供されるチャレンジ。 通常、Verifiable Presentation 応答に含められることが 期待されます。
domain [string]
リプレイ攻撃を防止することを意図して、 要求者によって提供されるドメイン。 通常、Verifiable Presentation 応答に含められることが 期待されます。
interact [array]
サーバーがサポートするインタラクション・メカニズムのリスト。 interact 配列内の各項目は 以下の形式のオブジェクトで MUST あります:
service [object]
Verifiable Presentation Request への応答を 受信できる、サーバーがサポートするサービス。 これは以下の形式のオブジェクトで MUST あります:
type [array]
サービスの型。 type 配列内の各項目は 文字列で MUST あります。
serviceEndpoint [string]
Verifiable Presentation Request に応答する目的で サービスとやり取りするために利用できる URL。
verifiablePresentation [object]
以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は 文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。 type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。 verifiableCredential 配列内の各項目は 以下の形式のオブジェクトで MUST あります:
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は 文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは 空で MAY あります。 Verifiable Credential は有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。 type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。これは以下の形式の オブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される 証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、 challenge と domain を含む Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための 証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される 証明の目的。
proofValue [string]
Linked Data 証明の値。
redirectUrl [string]
別の場所でインタラクションを継続するために使用できる、 クライアントへ送信する URL。 redirectUrl を渡すことは OPTIONAL です。
callback [object]
このステップの実行後に呼び出されるコールバック。 これは以下の形式のオブジェクトで MUST あります:
url [string]
コールバック・データを受信する URL。
issueRequests [array]
issueRequests 配列内の各項目は MUST
{
  "required": [
    "credentialTemplateId"
  ]
}
または
{
  "required": [
    "credentialTemplateIndex"
  ]
}
presentationSchema
提示に対して実行される妥当性確認を記述する JSON Schema のいずれか。 これは以下の形式のオブジェクトで MUST あります:
type [string]
値は JsonSchemaMUST あります。
jsonSchema [object]
オブジェクト
または、現在のステップで提示を妥当性確認するときに 使用する代替の提示スキーマ形式。特定の提示スキーマ型には 追加プロパティが期待されますが、この仕様の範囲外です。 これは以下の形式のオブジェクトで MUST あります:
type [string]
提示を妥当性確認するときに使用する 提示スキーマ・メカニズムの型。
verifyPresentationResponseSchema
提示の検証結果に対して実行される妥当性確認を記述する JSON Schema のいずれか。これは以下の形式のオブジェクトで MUST あります:
type [string]
値は JsonSchemaMUST あります。
jsonSchema [object]
オブジェクト
または、現在のステップで提示を検証した結果に使用する 代替の提示スキーマ形式。特定の提示スキーマ型には 追加プロパティが期待されますが、この仕様の範囲外です。 これは以下の形式のオブジェクトで MUST あります:
type [string]
提示の検証結果を妥当性確認するときに使用する 提示スキーマ・メカニズムの型。
nextStep [string]
シーケンス内の次のステップ名。 nextStep を渡すことは OPTIONAL です。このフィールドは 最終ステップ構成に存在しては MUST NOT なりません。
openId [object]
以下のいずれか
{
  "required": [
    "createAuthorizationRequest"
  ],
  "not": {
    "required": [
      "authorizationRequest"
    ]
  }
}
または
{
  "required": [
    "authorizationRequest"
  ],
  "not": {
    "required": [
      "createAuthorizationRequest"
    ]
  }
}
または以下の形式のオブジェクト:
clientProfiles [object]
オブジェクト
または以下の形式のオブジェクト:
stepTemplate [object]
ワークフロー・ステップのテンプレート。 これか他のステップ・データのいずれかが存在しなければなりませんが、 両方の集合が存在してはなりません。これは以下の形式の オブジェクトで MUST あります:
type [string]
テンプレートの型。
template [string]
ステップ・テンプレート。
400 無効な入力
401 認可されていません
500 内部エラー

交換には expires プロパティが関連付けられており、 交換の有効期限日時を示します。これは /workflows/{localWorkflowId}/exchanges エンドポイントを使用して作成されます。 これは、そのような交換に関連付けられたチャレンジの有効期間に影響します。 チャレンジが交換に結び付けられている場合、そのチャレンジは交換の expires プロパティで参照される日時に有効でなくなります。

3.6.3 交換の作成

POST /workflows/{localWorkflowId}/exchanges - 新しい交換を作成し、応答ヘッダーで交換メタデータの場所を返します。

/workflows/{localWorkflowId}/exchanges エンドポイントは、POST を受信する際に以下のスキーマを使用します:

プロパティ 説明
expires [string] 交換が期限切れになる日時(XML Schema dateTimeStamp として表現される)。
variables [object] オブジェクト
openId [object]
{
  "required": [
    "createAuthorizationRequest"
  ],
  "not": {
    "required": [
      "authorizationRequest"
    ]
  }
}
または
{
  "required": [
    "authorizationRequest"
  ],
  "not": {
    "required": [
      "createAuthorizationRequest"
    ]
  }
}
または以下の形式のオブジェクト:
clientProfiles [object]
オブジェクト

/workflows/{localWorkflowId}/exchanges エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
201 交換が正常に作成されました(データあり)
204 交換が正常に作成されました(データなし)
400 無効な入力
401 認可されていません
500 内部エラー

3.6.4 交換プロトコルの取得

このエンドポイントは、クライアントが、交換がサポートするすべてのプロトコルを その交換に照会するための仕組みを提供します。単一の交換は、 デジタル・ウォレットへの検証可能な クレデンシャルの発行など、交換の目標を達成できる多くのプロトコルを サポートできます。

GET /workflows/{localWorkflowId}/exchanges/{localExchangeId}/protocols - 特定の交換とやり取りするために サポートされるプロトコルを取得します。

/workflows/{localWorkflowId}/exchanges/{localExchangeId}/protocols エンドポイントは、GET を受信する際に 以下のいずれかの応答となる可能性があります:

応答 本文
200 交換が理解するプロトコル。
content-type: application/json
特定の交換を実行するために使用できるプロトコルに関する情報を含むオブジェクト。 これは以下の形式のオブジェクトで MUST あります:
protocols [object]
特定の交換を実行するために使用できる 1 つ以上のプロトコルを含むオブジェクト。 これは以下の形式のオブジェクトで MUST あります:
interact [string]
人間が関与する交換フロー中に使用できる URL。 詳細については、interact URL 形式の節を 参照してください。
vcapi [string]
VCALM 交換を開始するときに使用する URL。
OID4VP [string]
OID4VP 提示を開始するときに使用する URL。
OID4VCI [string]
OID4VCI 発行を開始するときに使用する URL。
400 無効な入力
401 認可されていません
500 内部エラー

このエンドポイントはまた、Web サイト運営者が、HTTPS ドメインを通じてその信頼を委任することで、 サービス・プロバイダーなどの第三者に交換を実行する権限を委任できるようにします。 たとえば、Web サイト brand.example は、プロトコル一覧で saas.example ドメインを使用することにより、交換の運用をパートナー saas.example に委任できます。

3 ウォレットが委任された交換サービスへのプロトコルを使用する例。

これにより、クライアントは brand.example への信頼に基づいて、 Web サイトが Web ページをレンダリングするために他のドメインのリソースへリンクするのと同じ方法で、 交換の運用を第三者に委任できます。

3.6.5 交換への参加

サーバーは、交換メッセージに referenceId プロパティを含めても MAY かまいません。クライアントが referenceId を受信した場合、 次にサーバーへ送るメッセージに同じ referenceId を含める SHOULD です。 これはデバッグに役立ち、遅延した可能性のある、または順序が乱れた メッセージが正しい要求に関連付けられることを保証します。 referenceId の値は urn:uuid: 値である SHOULD です。

POST /workflows/{localWorkflowId}/exchanges/{localExchangeId} - 交換に参加します。 空の本文を POST すると、交換を開始するか、次のステップを完了するために交換が期待しているものを 返します。Verifiable Presentation Request を POST すると、4xx エラー、または以下のいずれか、 すなわちクライアントの要求に適合する Verifiable Presentation または Verifiable Presentation Request が返されます。Verifiable Presentation が送信される場合、 交換を継続するために追加の Verifiable Presentation Request も送信される場合があります。

/workflows/{localWorkflowId}/exchanges/{localExchangeId} エンドポイントは、POST を受信する際に 以下のいずれかのスキーマを使用します:

プロパティ 説明

あるいは、/workflows/{localWorkflowId}/exchanges/{localExchangeId} エンドポイントは、 以下のスキーマも使用できます:

プロパティ 説明
verifiablePresentationRequest [object] Verifiable Presentation Request。これは以下の形式のオブジェクトで MUST あります:
query [array]
要求者によって送信される 1 つ以上のクエリの集合。 query 配列内の各項目は、以下の形式のオブジェクトで MUST あります:
type [array]
クエリの型。type 配列内の各項目は文字列で MUST あります。
credentialQuery [object]
QueryByExample クエリの場合、クレデンシャル要求の詳細を指定します。 これは以下の形式のオブジェクトで MUST あります:
reason [string]
クレデンシャルが要求されている理由についての 人間可読な説明。
example [object]
オブジェクト
acceptedIssuers [array]
要求されたクレデンシャルに対して受け入れられる発行者。 acceptedIssuers 配列内の各項目は、 以下の形式のオブジェクトで MUST あります:
issuer [string]
acceptedCryptosuites [array]
検証者が受け入れる暗号証明スイート。各要素は、 Data Integrity 暗号スイート名、またはレガシー用の Ed25519Signature2020 を参照する cryptosuite プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用でき、暗号スイート名として解釈されます)。これにより、 保持者は適切な証明形式を選択できます。このプロパティは、 エンベロープされたクレデンシャルにのみ適用される acceptedEnvelopes とは独立して MAY 使用できます。 acceptedCryptosuites 配列内の各項目は undefined: で MUST あります。
acceptedEnvelopes [array]
検証者が受け入れるエンベロープ形式。各要素は、 エンベロープ用のメディア型を参照する mediaType プロパティを持つオブジェクトで SHOULD あります(後方互換性のため、 文字列値も MAY 使用でき、 メディア型として解釈されます)。これにより、保持者は既定の Data Integrity 形式以外の形式でクレデンシャルを提供できます。 このプロパティは、受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ適用される acceptedCryptosuites とは独立して MAY 使用できます。 acceptedEnvelopes 配列内の各項目は undefined: で MUST あります。
challenge [string]
リプレイ攻撃を防止することを意図して、要求者によって提供されるチャレンジ。 通常、Verifiable Presentation 応答に含められることが期待されます。
domain [string]
リプレイ攻撃を防止することを意図して、要求者によって提供されるドメイン。 通常、Verifiable Presentation 応答に含められることが期待されます。
interact [array]
サーバーがサポートするインタラクション・メカニズムのリスト。 interact 配列内の各項目は、以下の形式のオブジェクトで MUST あります:
service [object]
Verifiable Presentation Request への応答を受信できる、 サーバーがサポートするサービス。これは以下の形式のオブジェクトで MUST あります:
type [array]
サービスの型。type 配列内の各項目は 文字列で MUST あります。
serviceEndpoint [string]
Verifiable Presentation Request に応答する目的で、 サービスとやり取りするために利用できる URL。
referenceId [string] サーバーが以前に referenceId を送信した場合、クライアントはデバッグと メッセージ相関を支援するために、ここにそれを含めるべきです(SHOULD)。 値は urn:uuid 値であるべきです(SHOULD)。
プロパティ 説明
verifiablePresentation [object] 以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。@context 配列内の各項目は 文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の各項目は、 以下の形式のオブジェクトで MUST あります:
@context [array]
クレデンシャルの JSON-LD コンテキスト。@context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、id プロパティを 設定できないユースケースがあるため、発行者は、提供されていない場合に id プロパティを自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式のオブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
referenceId [string] サーバーが以前に referenceId を送信した場合、クライアントはデバッグと メッセージ相関を支援するために、ここにそれを含めるべきです(SHOULD)。 値は urn:uuid 値であるべきです(SHOULD)。
プロパティ 説明
redirectUrl [string] クライアントは、別の関連する交換について、そのインタラクション URL から開始する クライアントになるようサーバーを招くため、redirectUrl としてインタラクション URL を サーバーへ送信しても MAY かまいません。 サーバーはこの redirectUrl と関与しても MAY かまいません。
referenceId [string] サーバーが以前に referenceId を送信した場合、クライアントはデバッグと メッセージ相関を支援するために、ここにそれを含めるべきです(SHOULD)。 値は urn:uuid 値であるべきです(SHOULD)。

/workflows/{localWorkflowId}/exchanges/{localExchangeId} エンドポイントは、POST を受信する際に 以下のいずれかの応答となる可能性があります:

応答 本文
200 交換が進行しました。
content-type: application/json
以下の形式のオブジェクト:
verifiablePresentationRequest [object]
Verifiable Presentation Request。これは以下の形式のオブジェクトで MUST あります:
query [array]
要求者によって送信される 1 つ以上のクエリの集合。 query 配列内の各項目は、以下の形式の オブジェクトで MUST あります:
type [array]
クエリの型。type 配列内の各項目は 文字列で MUST あります。
credentialQuery [object]
QueryByExample クエリの場合、クレデンシャル要求の詳細を 指定します。これは以下の形式のオブジェクトで MUST あります:
reason [string]
クレデンシャルが要求されている理由についての 人間可読な説明。
example [object]
オブジェクト
acceptedIssuers [array]
要求されたクレデンシャルに対して受け入れられる発行者。 acceptedIssuers 配列内の各項目は 以下の形式のオブジェクトで MUST あります:
issuer [string]
acceptedCryptosuites [array]
検証者が受け入れる暗号証明スイート。各要素は、 Data Integrity 暗号スイート名、またはレガシー用の Ed25519Signature2020 を参照する cryptosuite プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用でき、暗号スイート名として解釈されます)。これにより、 保持者は適切な証明形式を選択できます。このプロパティは、 エンベロープされたクレデンシャルにのみ適用される acceptedEnvelopes とは独立して MAY 使用できます。 acceptedCryptosuites 配列内の各項目は undefined: で MUST あります。
acceptedEnvelopes [array]
検証者が受け入れるエンベロープ形式。各要素は、 エンベロープ用のメディア型を参照する mediaType プロパティを持つオブジェクトで SHOULD あります (後方互換性のため、文字列値も MAY 使用でき、メディア型として解釈されます)。これにより、 保持者は既定の Data Integrity 形式以外の形式で クレデンシャルを提供できます。このプロパティは、 受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ適用される acceptedCryptosuites とは独立して MAY 使用できます。 acceptedEnvelopes 配列内の各項目は undefined: で MUST あります。
challenge [string]
リプレイ攻撃を防止することを意図して、要求者によって提供される チャレンジ。通常、Verifiable Presentation 応答に含められることが 期待されます。
domain [string]
リプレイ攻撃を防止することを意図して、要求者によって提供される ドメイン。通常、Verifiable Presentation 応答に含められることが 期待されます。
interact [array]
サーバーがサポートするインタラクション・メカニズムのリスト。 interact 配列内の各項目は、以下の形式のオブジェクトで MUST あります:
service [object]
Verifiable Presentation Request への応答を受信できる、 サーバーがサポートするサービス。これは以下の形式の オブジェクトで MUST あります:
type [array]
サービスの型。type 配列内の各項目は 文字列で MUST あります。
serviceEndpoint [string]
Verifiable Presentation Request に応答する目的で、 サービスとやり取りするために利用できる URL。
referenceId [string]
交換メッセージを相関させるための任意の識別子。サーバーはこの値を含めても MAY かまいません。存在する場合、クライアントは 次のメッセージにそれを含める SHOULD です。 値は urn:uuid 値である SHOULD です。
または以下の形式のオブジェクト:
verifiablePresentation [object]
以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。@context 配列内の各項目は 文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。verifiableCredential 配列内の各項目は以下の形式のオブジェクトで MUST あります:
@context [array]
クレデンシャルの JSON-LD コンテキスト。@context 配列内の各項目は文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。Verifiable Credential は 有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを 自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、challenge と domain を含む Data Integrity Proof。これは以下の形式の オブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
referenceId [string]
交換メッセージを相関させるための任意の識別子。サーバーはこの値を含めても MAY かまいません。存在する場合、クライアントは 次のメッセージにそれを含める SHOULD です。 値は urn:uuid 値である SHOULD です。
以下の形式のオブジェクト:
redirectUrl [string]
交換がクライアントをリダイレクトしたい URL。
referenceId [string]
交換メッセージを相関させるための任意の識別子。サーバーはこの値を含めても MAY かまいません。存在する場合、クライアントは 次のメッセージがあれば、それに含める SHOULD です。 値は urn:uuid 値である SHOULD です。
交換を終了することをサーバーが望んでいることを示す、交換継続プロパティを 持たない空のオブジェクト。これは以下の形式のオブジェクトで MUST あります:
referenceId [string]
交換メッセージを相関させるための任意の識別子。サーバーはこの値を含めても MAY かまいません。存在する場合、送信する次のメッセージがあれば、 クライアントはその次のメッセージにそれを含める SHOULD です。値は urn:uuid 値である SHOULD です。
400 無効な入力
401 認可されていません
500 内部エラー

3.6.6 交換状態の取得

GET /workflows/{localWorkflowId}/exchanges/{localExchangeId} - 既存の交換の状態を取得し、 応答本文で返します。

/workflows/{localWorkflowId}/exchanges/{localExchangeId} エンドポイントは、GET を受信する際に 以下のいずれかの応答となる可能性があります:

応答 本文
200 交換構成が取得されました!
content-type: application/json
アクティブな交換に関する情報を含むオブジェクト。指定された交換に送信する VP も redirectUrl もない場合、これは空のオブジェクトになることがあります。 これは以下の形式のオブジェクトで MUST あります:
id [string]
交換を識別するローカル交換 ID。
sequence [integer]
交換のシーケンス番号。作成時に 0 に設定されます。
expires [string]
交換が期限切れになる日時(XML Schema dateTimeStamp として表現される)。
step [string]
交換内の現在のステップ。
state [string]
交換の状態("pending" | "active" | "complete" | "invalid")。 作成時に "pending" に設定されます。
lastError [object]
以下の形式のオブジェクト:
type [string]
問題の型を識別する URL。
title [string]
問題に関する短いが具体的な人間可読文字列。
detail [string]
問題に関するより長い人間可読文字列。
variables [object]
交換に必要な変数。これは以下の形式のオブジェクトで MUST あります:
results [object]
交換の各ステップからの結果。これは以下の形式のオブジェクトで MUST あります:
STEP_NAME [object]
交換のステップからの結果。これは以下の形式のオブジェクトで MUST あります:
verifiablePresentation [object]
以下の形式のオブジェクト:
@context [array]
提示の JSON-LD コンテキスト。 @context 配列内の各項目は 文字列で MUST あります。
id [string]
提示の ID。
type [array]
提示の JSON-LD 型。 type 配列内の各項目は 文字列で MUST あります。
holder [object]
オブジェクト
verifiableCredential [array]
Verifiable Credentials。 verifiableCredential 配列内の各項目は、以下の形式のオブジェクトで MUST あります:
@context [array]
クレデンシャルの JSON-LD コンテキスト。 @context 配列内の各項目は 文字列で MUST あります。
id [string]
クレデンシャルの ID。このプロパティは空で MAY あります。 Verifiable Credential は有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、 発行者は、提供されていない場合に id プロパティを 自動生成すべきではありません。
type [array]
クレデンシャルの JSON-LD 型。 type 配列内の各項目は 文字列で MUST あります。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。これは以下の形式の オブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される 証明の目的。
proofValue [string]
Linked Data 証明の値。
proof [object]
W3C VC Data Integrity 仕様で定義される、 challenge と domain を含む Data Integrity Proof。 これは以下の形式のオブジェクトで MUST あります:
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
challenge [string]
認証証明のリプレイ攻撃を軽減するために 検証者が選択した値。
domain [string]
証明の使用を特定の対象に制限するための 証明のドメイン。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される 証明の目的。
proofValue [string]
Linked Data 証明の値。
openId [object]
OID4VCI/OID4VP 保持者インタラクションからの結果。 これは以下の形式のオブジェクトで MUST あります:
clientProfileId [object]
オブジェクト
authorizationResponse [object]
オブジェクト
presentationSubmission [object]
オブジェクト
inviteRequest [object]
招待要求からの結果。これは以下の形式のオブジェクトで MUST あります:
inviteResponse [object]
保持者をリダイレクトする場所を示す、招待要求への応答。 これは以下の形式のオブジェクトで MUST あります:
url [string]
交換を進めるべき URL。
purpose [string]
インタラクションの説明。
referenceId [string]
招待要求の一意な ID。
400 無効な入力
401 認可されていません
500 内部エラー

3.6.7 交換ステップ・コールバック

POST /callbacks/{localCallbackId} - 交換ステップが実行されたときに通知を受けられる、 任意のケイパビリティ URL(すなわち、推測が実行困難な URL)になり得るコールバック。 この URL は、認可トークン、定期的なトークン更新、またはクライアント登録を必要とせずに、 URL が共有された当事者だけが使用できることを保証するため、ケイパビリティ URL である SHOULD です。提案された "localCallbackId" を含む URL 形式を使用する場合、 "localCallbackId" 値は、完全なコールバック URL をケイパビリティ URL として扱えることを保証するために、 少なくとも 128 ビットのランダム情報を表現しなければなりません。また、交換ごとに新しい ケイパビリティ URL を作成し、その交換でのみ使用することも推奨されます。

/callbacks/{localCallbackId} エンドポイントは、POST を受信する際に以下のスキーマを使用します:

プロパティ 説明
event [object] コールバックに関連付けられたイベント情報。これは以下の形式のオブジェクトで MUST あります:
data [object]
コールバックに関連付けられたイベントデータ。これは以下の形式のオブジェクトで MUST あります:
exchangeId [string]
交換の現在の状態を取得するために使用できる、交換状態への URL。

/callbacks/{localCallbackId} エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
200 コールバック・データを受信しました。
400 コールバック・データは受信されませんでした。

3.6.8 交換の例

この仕様の API により、非仲介型(自動化された、マシン間)または仲介型(人間が関与する) 交換を実行できます。これらの交換は、保持者 コーディネーターによって開始され、 交換を実装する任意のコーディネーターによって応答されます。フローは以下の ステップで構成されます:

  1. 保持者コーディネーターが受信側 コーディネーターに連絡し、特定の交換の開始を要求します。
  2. 受信側コーディネーターは、保持者コーディネーターを認証および/または 認可するために、何らかの提示要求で応答し、交換内の次のホップを URL として提供します。
  3. 保持者コーディネーターは、提示要求を満たす情報を含む Verifiable Presentation で受信側コーディネーターに応答します。
  4. 受信側コーディネーターは、新しく発行された Verifiable Credentials を含む Verifiable Presentation、または上記ステップ 2 で表現されたさらなる提示要求で応答します。

保持者コーディネーターは、実際に交換を開始する前に、 特定のエンドポイント上で保持者コーディネーターが コーディネーターのプロトコル要件をサポートするかどうかを判断するために、 コーディネーターの交換発見エンドポイントを呼び出しても MAY かまいません。

上記で概説したステップの図を以下に示します:

4 保持者発行者/検証者の間の標準的な交換。
注記

上記の一般的な交換は、完全に自動化された方法、人間によって仲介される方法、 または一部は自動化されるが特定の段階で人間の介入が必要となるハイブリッドな方法で 実行できます。上記の 2 番目のステップは、次のステップが自動化されているか、 個人の介入を必要とするかについての指針を提供するために使用されます。

以下の図は、保持者 コーディネーターが Verifiable Presentation Request で開始し、 続行する前に受信側コーディネーターからのクレデンシャルを要求する交換を示しています:

5 保持者が 続行する前に発行者/検証者から クレデンシャルを要求する、クライアント開始型の交換。

以下の図は、保持者 コーディネーターがサーバーの最初の要求を受信した後に反対要求を送信する交換を示しています:

6 保持者が サーバーの最初の要求を受信した後に発行者/検証者から クレデンシャルを要求する、交換中の反対要求。

以下の例は、交換クライアントが、受け入れる暗号証明形式とエンベロープ型を指定する verifiablePresentationRequest を用いて交換を開始することを示します。 credentialQuery プロパティが存在しない場合、交換クライアントは、 指定された形式に一致する、ワークフロー・サービスからの任意のクレデンシャルを受け入れます。

15: 受け入れ形式を伴う クライアント開始型交換
{
  "verifiablePresentationRequest": {
    "query": [{
      "type": "QueryByExample",
      "credentialQuery": {
        "acceptedCryptosuites": [
          {"cryptosuite": "eddsa-rdfc-2022"},
          {"cryptosuite": "ecdsa-rdfc-2019"},
          {"cryptosuite": "bbs-2023"}
        ],
        "acceptedEnvelopes": [
          {"mediaType": "application/jwt"}
        ]
      }
    }]
  }
}

以下の例は、交換クライアントが後続の要求を満たす前に、ワークフロー・サービスから クレデンシャルを要求することを示します。このシナリオでは、交換クライアントは、 個人情報を共有する前に、サーバー運用者が登録済み事業者であることの証明を要求します。

16: 続行前にサーバー・クレデンシャルを要求する クライアント
{
  "verifiablePresentationRequest": {
    "query": [{
      "type": "QueryByExample",
      "credentialQuery": {
        "reason": "Please present your BusinessRegistrationCredential to complete the verification process.",
        "example": {
          "@context": [
            "https://www.w3.org/ns/credentials/v2"
          ],
          "type": ["BusinessRegistrationCredential"]
        },
        "acceptedCryptosuites": [
          {"cryptosuite": "eddsa-rdfc-2022"}
        ]
      }
    }]
  }
}

3.7 インタラクションの開始

ある実装が、それとのインタラクションをどのように開始するかを 別の実装へ伝達できることは有用です。このブートストラップ処理は、 インタラクションを開始すると呼ばれ、 各実装がどのプロトコルをサポートするか、およびその実装との特定の インタラクションをどのように開始するかを伝達します。

注記: インタラクションは、 アプリケーション、ユースケース、プロトコルに依存しません

この文書にはいくつかのインタラクション仕様が含まれていますが、一般的な アプローチは、ユースケース、アプリケーション、およびプロトコルに依存しません。 このアプローチは、Web ブラウザー、QR コード(光学媒体)、または NFC(無線媒体)などの任意の伝送媒体を通じて、特定のプロトコルへ ブートストラップすることを望む 2 つ以上のアプリケーションをペアリングするために 使用できます。そのプロトコルがこの API を含む必要はありません。

以下のシーケンス図は、発行者がインタラクション URL を生成し、QR コードを使用してそれを保持者と共有し、 vcapi プロトコルで進行することを概説しています:

7 QR コードを使用する発行者開始型のインタラクション

以下のシーケンス図は、検証者がインタラクション URL を生成し、QR コードを使用してそれを保持者と共有し、 vcapi プロトコルで進行することを概説しています:

8 QR コードを使用する検証者開始型のインタラクション

以下のシーケンス図は、保持者がインタラクション URL を生成し、 QR コードを使用してそれを検証者と共有し、 inviteRequest プロトコルで進行することを概説しています:

9 QR コードを使用する保持者開始型のインタラクション

3.7.1 インタラクション URL 形式

インタラクション URL の形式は、 URL Standard の構文に適合しなければ MUST ならず、 インタラクション URL のバージョン番号を符号化する iuv クエリパラメーターを含まなければ ならず、この API のこのバージョンを使用する場合、その値は 1 でなければ MUST なりません。 インタラクション URL は、インタラクション固有の識別子を含む HTTPS URL であるべき SHOULD です。URL は不透明であるべきであり、 受信側システムによって取得される前に URL 構文処理を必要とすべきでは SHOULD ありません。 そのような URL の例を以下に示します:

17: インタラクション URL
https://app.example/interactions/z8n38Dp7a?iuv=1

長いプロトコル固有情報を URL に符号化するプロトコルは、 ソフトウェア・ライブラリによって URL の最大許容長に課される制限の影響を受けます。 執筆時点では、推奨される URL 長の上限はおよそ 2,000 文字です。 実装者は、Section 3.7.4 インタラクション・プロトコル応答で定義される、 インタラクション URL に対する GET 要求への応答で表現できる情報を、 インタラクション URL のクエリパラメーターに入れるべきでは SHOULD NOT ありません。

注記: インタラクション URL はワークフロー・サービスではなくコーディネーター上に存在します

コーディネーターは、消費側ソフトウェアによって(iuv クエリパラメーターを除き) 不透明なものと見なされることが期待されるため、自身の Web オリジン上の任意の場所に インタラクション URL を配置する自由があります。 ただし、インタラクション URL がコーディネーター上でホストされ、ワークフロー・サービスで ホストされないことが重要です。これにより、コーディネーターの Web オリジン (DNS ドメイン名)を、消費者にとって一貫した信頼シグナルとして使用でき、 アクションを調整する可能性のあるビジネスルールを適用できます。

3.7.2 インタラクション QR コード形式

インタラクション QR コード は、 ISO18004:2024: QR Code Bar Code Symbology Specification に従って QR コードとして表現された インタラクション URL でなければ MUST なりません。広範な相互運用性を確保するために、 インタラクション URL の長さは 可能な限り短いべきであり SHOULD、400 英数字を超えるべきではなく SHOULD NOT、4,296 英数字を超えては MUST NOT なりません。インタラクション QR コードの例は 以下で確認できます:

インタラクション URL を符号化している、
黒と白の点で埋められた正方形の画像
10 https://app.example/interactions/z8n38Dp7a?iuv=1 のインタラクション QR コード

3.7.3 インタラクション・スキーム形式

インタラクション URL を処理できるアプリケーションを 呼び出せることは有用です。この節では、この目的のために interaction: プロトコル・スキーム形式を定義します。 プロトコル・スキームの形式は、以下の構文に適合しなければ MUST なりません:

インタラクション・プロトコル・スキーム
scheme          = "interaction:" interaction-url
interaction-url = URL

interaction-url は、URL Standard に適合し、その URL にあるリソースを取得すると インタラクション・プロトコル応答となる任意の URL です。

18: インタラクション・スキーム URL の例
interaction:https://app.example/interactions/z8n38Dp7a?iuv=1

3.7.4 インタラクション・プロトコル 応答

インタラクション URL を取得すると、 リモート・システムとのインタラクションを開始する方法に関する指示が得られます。

インタラクション URLapplication/jsonAccept ヘッダーを使用して取得される場合、 protocols map を含む 単一の JSON オブジェクトが返されなければ MUST ならず、各 key はプロトコル識別子であり、各 value は インタラクションを開始するために使用できる URL です。たとえば、 https://app.example/interactions/z8n38Dp7a?iuv=1 インタラクション URL に対して HTTP GET を実行すると、 以下のいずれかの応答となる場合があります:

19: 指定されたインタラクションでサポートされる プロトコルのリスト。inviteRequest は使用中のワークフロー・サービスによって生成されます。
{
  "protocols": {
    "inviteRequest": "https://saas.example/workflows/123/exchanges/987/invite-request/response",
    "vcapi": "https://saas.example/workflows/123/exchanges/987",
    "OID4VP": "openid4vp://?client_id=https%3A%2F%2Fapp.example%2Fworkflows%2F123%2Fexchanges%2F987%2Fopenid%2Fclient%2Fauthorization%2Fresponse&request_uri=https%3A%2F%2Fapp.example%2Fworkflows%2F123%2Fexchanges%2F987%2Fopenid%2Fclient%2Fauthorization%2Frequest'"
  }
}
20: プロトコルのリストに inviteRequest オプションのみが含まれる 退化ケース。
{
  "protocols": {
    "inviteRequest": "https://saas.example/interactions/123/invite-request/response"
  }
}

プロトコル応答により、交換プロトコルの取得節で 説明されている委任メカニズムと同様に、HTTPS ドメイン信頼モデルを通じて、 プロトコル実行を第三者サービス・プロバイダーに委任できます。たとえば、 Web サイト app.example は、プロトコルのリストに saas.example ドメインを含めることで、交換の運用をパートナー saas.example に委任できます。

インタラクション URL が認識されない Accept ヘッダーを使用して取得される場合、 インタラクション URL の処理方法を理解する特定のソフトウェアを使用するよう人間に指示する 説明を含む text/html 文書が返されなければ MUST なりません。

注記: 交換 URL へのマッピング

一部のコーディネーター実装は、プロトコル・エンドポイントを交換インスタンスの プロトコル・エンドポイントへのパススルーとして実装します。たとえば、 https://app.example/interactions/z8n38Dp7a?iuv=1 に対する GET は、 https://app.example/workflows/123/exchanges/987/protocols に対する パススルー GET となり、上記の応答を返すことがあります。この方法で インタラクション URL を実装すると、より容易な実装経路を提供できます。

3.7.5 inviteRequest インタラクション・プロトコル

inviteRequest インタラクション・プロトコルは、ローカル・システムがリモート・システムに対して、 特定の URL を通じてリモート・システムへの招待を望んでいることを知らせるために使用されます。 たとえば、個人がユースケース固有のインタラクションに参加できる Web サイトなどです。 inviteRequest インタラクション・プロトコルが選択された場合、ローカル・システムは HTTP POST を使用してデータを送信し、個人をどこへ送るべきかをリモート・システムに指示します。 POST データの例を 2 つ以下に示します。 これらの例は、この仕様が "url" フィールドの形式についていかなる要件も述べていない一方で、 このインタラクション・メカニズムの実装者に一意な ID を使用することを推奨している点を 強調することを意図しています:

21: 店舗でチェックアウトするための招待要求への応答
{
  "url": "https://website.example/checkout/8372974",
  "purpose": "Checkout at ShopCo",
  "referenceId": "417bcaf2-14d9-11f0-99d7-9f094678517b"
}
22: オンラインフォームに入力するための招待要求への応答
{
  "url": "https://website.example/forms/7864165",
  "purpose": "Fill out online form",
  "referenceId": "d4a6e5b8-1715-4654-8e47-e68b311756d1"
}

3.7.6 vcapi インタラクション・プロトコル

vcapi インタラクション・プロトコルは、Section 3.6.5 交換への参加で説明されている、特定の 交換 を開始するために使用されます。

23: VC-API インタラクション・プロトコル要求
{
  "verifiablePresentationRequest": {
    "query": [{
      "type": "QueryByExample",
      "credentialQuery": {
        "reason": "Please provide your student ID.",
        "example": {
          "@context": [
            "https://www.w3.org/ns/credentials/v2",
            "https://www.w3.org/ns/credentials/examples/v2",
          ],
          "type": "StudentIdCredential",
          "credentialSubject": {
            "studentId": ""
          },
        },
        "trustedIssuer": [{
          "issuer": "did:web:university.example"
        }]
      }
    }],
    "challenge": "5e34826e-14da-11f0-98a5-8b1c0a196728",
    "domain": "university.example"
  }
}

3.8 エラー処理

実装が文書の処理中に異常を検出した場合、 ProblemDetails オブジェクトを使用して、その問題を他の ソフトウェア・システムへ報告できます。これらのオブジェクトのインターフェイスは、 データを符号化するために [RFC9457] に従います。ProblemDetails map は、以下の プロパティで構成されます:

type
type key は存在しなければ MUST ならず、その値は問題の型を識別する URL でなければ MUST なりません。
title
title key は、問題に関する短いが具体的な人間可読 文字列を提供すべき SHOULD です。
detail
detail key は、問題に関する より長い人間可読文字列を提供すべき SHOULD です。

detailinstance などの key を活用して、エラーに関するより文脈的なフィードバックを提供することが推奨されます。 ただし、セキュリティ上の懸念を意識し、機密情報を開示しないようにする必要があります。

この仕様では、以下の問題記述型を定義します:

https://www.w3.org/TR/vcalm#UNKNOWN_OPTION_PROVIDED
実装が認識しないオプションが API 呼び出しに提供されました。

実装によって報告される可能性のある ProblemDetails のさらなるリストは、 以下の仕様で確認できます:

24: ProblemDetails オブジェクトの例
{
  "type": "https://www.w3.org/TR/vc-data-model#CRYPTOGRAPHIC_SECURITY_ERROR",
  "status": 400,
  "title": "CRYPTOGRAPHIC_SECURITY_ERROR",
  "detail": "The cryptographic security mechanism couldn't be verified. This is likely due to a malformed proof or an invalid verificationMethod."
}
課題 3

上記の例の type URL は、VCDM v2.0 がグローバル標準になった後、 将来的に機能するようになります。エラーが適切な場所にリンクすることを確実にするため、 当面は https://www.w3.org/TR/vc-data-model のベース URL を www.w3.org/TR/vc-data-model-2.0 に置き換えることができます。

実装者は、本番環境におけるすべてのサーバー・エラーをサニタイズすることを 強く推奨されます。そうしないと、情報漏えいにつながる可能性があります。

検証の実行中にエラーを発生させることは避け、代わりに 検証結果に含める ProblemDetails オブジェクトを収集することが推奨されます。

3.8.1 検証エラー と警告

この仕様は、検証エラーと検証警告の区別を定義します。 エラーは、暗号、データモデル、および不正な形式のコンテキストに関連する ProblemDetails であり、回復不能です。警告は、 ステータスと有効期間に関連する ProblemDetails であり、 回復可能な場合があるか、または後続のアクションをアプリケーションの裁量に 委ねる場合があります。

エラーが含まれる場合、VerificationResponse オブジェクトの verified プロパティは false に設定されなければ MUST ならず、エラーが含まれない場合は true に設定されなければ MUST なりません。

25: 警告とエラーを含む検証応答の例。
{
  "verified": false,
  "document": verifiableCredential,
  "mediaType": "application/vc",
  "controller": issuer,
  "controllerDocument": didDocument,
  "warnings": [ProblemDetails],
  "errors": [ProblemDetails]
}

A. プライバシーに関する考慮事項

A.1 委任

検証可能なクレデンシャル [VC-DATA-MODEL-2.0] は、誤用や詐欺のリスクを 軽減するように設計された標準データ モデルです。データモデルとして、検証可能な クレデンシャル はプロトコル中立であり、少なくとも 2 種類の エンティティを考慮します: 発行者主体検証可能な クレデンシャル の主体が自然人である、または自然人に関連付けられている場合、 標準化された 検証可能なクレデンシャル の処理が、それらのアナログな 先行物と比べてはるかに効率的であることにより、プライバシーと人権に 影響が及ぶ可能性があります。

検証可能な クレデンシャル を発行するための標準化された API とプロトコルという形の技術は、 検証可能なクレデンシャル の処理効率をさらに高め、予期しないプライバシーおよび 人権上の結果に関するリスクを増大させます。

検証可能なクレデンシャル の発行には、要求フェーズと配信フェーズがあります。 要求は 主体 または別の役割によって行われる可能性があり、 配信は、主体によって制御されている場合も、そうでない場合もあるクライアントに対して 行われる可能性があります。委任はどちらのフェーズにも非常に関連します。発行者 は、要求の処理を 別のエンティティに委任する可能性があります。主体もまた、自らの側で、 検証可能なクレデンシャル を要求する能力を別の エンティティに委任する可能性があります。主体が常に委任を実行する能力または 手段を持つとは限らない点に注意してください。例には、新生児、ペット、認知症の 人が含まれます。そのため、要求は主体によって委任されていない第三者によって 実行される可能性があります。委任できる能力は、検証可能なクレデンシャル の処理効率向上における第三の次元であり、 プライバシーと人権に影響を与えます。

この仕様で説明されるアーキテクチャは、効率性とプライバシーおよび人権の尊重の 組み合わせを通じて市場に受け入れられるように設計されています。 検証可能なクレデンシャル を処理するための API とプロトコルは、 発行者ロールによる委任を、主体ロールによる委任より優先しません。

A.2 「Phoning Home」は 有害と見なされる

検証者が、特定の 発行者検証可能なクレデンシャル について問い合わせることは、 プライバシー上の悪い慣行と見なされます。この慣行は「phoning home」として知られており、 保持者発行者検証者、および 検証可能なクレデンシャルに表現される その他の当事者の間で、プライバシー期待の不一致を招く可能性があります。 Phoning home により、発行者 は、気付いていない当事者を 特定の 検証可能なクレデンシャル の使用と相関させることができ、これは それらのクレデンシャルの使用に関して各エンティティが持つ可能性のある プライバシー期待に違反し得ます。たとえば、保持者が 自分と検証者の間の私的なインタラクションであると 期待しているものが、発行者に そのインタラクションが通知されるものになります。

プライバシーを保護する方法で 発行者 に問い合わせることが、 保持者 のプライバシー期待を支える インタラクションもあります。たとえば、グループ・プライバシーを提供する ステータスリストを通じるなど、プライバシーを尊重する方法で失効ステータス情報を得るために 発行者に問い合わせることは、 ステータスリストの取得に基づいて、どの 検証可能なクレデンシャル が照会されているかを発行者が特定できない限り、 許容され得ます。そのようなメカニズムの詳細については、 Bitstring Status List v1.0 仕様を参照してください。

検証者は、 プライバシー侵害を生み出す方法で「phone home」しないよう強く求められます。 検証可能なクレデンシャルからリンクされた コンテンツを取得する際には、Oblivious HTTP などのメカニズムを使用し、 結果を積極的にキャッシュすることで、エコシステムのプライバシー特性を 改善できます。

B. セキュリティに関する考慮事項

B.1 未知の証明型

デジタル・ウォレット・ソフトウェアなどの 保持者コーディネーター実装は、 ソフトウェアが理解していない証明を含む 検証可能なクレデンシャル を受信して保存できますが、これらの証明は 実装によって提示されるべきではありません。複数の証明を持ち、その一部を 実装が理解し、その他を理解しない 検証可能なクレデンシャルは、 選択された証明を実装が理解しており、他の証明が提示前に削除される場合に限り、 実装によって提示できます。実装は理解している証明の許可リストを維持し、 存在してはならない証明が 提示前に取り除かれることを保証します。

実装は、未知の証明の存在を、 分散型エコシステムにおける潜在的な採用シグナルとして使用できます。また、実装者が 三者モデルにおいて、保持者 コーディネーター発行者検証者の間の導管として機能し、 保持者 コーディネーターが必ずしも特定の検証証明を実装していない場合でも、 両者の間の相互運用性を可能にすることを理解することも重要です。別の分野の例として: 「Web ブラウザーは、自らの PDF リーダー機能を追加する前から PDF ファイルを ダウンロードして保存できていました」— この種の分散型イノベーション、相互運用性、 および漸進的強化は、三者モデルにおいて、またより一般にはスケーラブルな分散型エコシステムにおいて 重要です。また、現在のソフトウェアがまだ理解していない証明を少なくとも 1 つ持つ 検証可能なクレデンシャル を保存するためだけに、特定の新しく異なるソフトウェアの採用を人々に強制しないことで、 中央集権化を減らす助けとなることも重要です。

保持者コーディネーターは、検証するためのソフトウェアを 持っていない場合でも、いくつかの証明を提示できる可能性がありますが、 これは推測ではなく、確実に理解されている必要があります。つまり、 保存された検証可能なクレデンシャルのコピーを 提示に追加する際、 保持者ソフトウェアは、 安全に提示できると明示的に知っていない証明を 削除する必要があります。ソフトウェアが安全に提示できると明示的に知っている 証明は残すことができます。 たとえば、ecdsa-rdfc-2019 証明は検証できるが、 ecdsa-jcs-2019 証明は検証できない デジタル・ウォレットでも、どちらかを提示できる場合があります。 選択的開示selective disclosure および/またはリンク不能開示unlinkable disclosure 機能を提供するものなど、その他の証明は、 変換(つまり、 基本証明が派生証明と「reveal document」に変換されること)を必要とし、 したがって、ウォレットが証明を導出する手順を実装していない限り、ウォレットはこれらの 提示証明を行うことはできません。 ウォレットが誤って基本証明を提示しないことは極めて重要です。なぜなら、それには 保持者にとって秘密である情報が 含まれる可能性があるためです。

B.2 インタラクション URL における HTTPS の使用

この仕様は、以下の理由により、インタラクション URL に HTTPS を使用することを 強く推奨します:

HTTPS 信頼モデルに根ざしていないプロトコル・スキームを使用するには、 別個の暗号化プロトコル、鍵管理、および信頼モデルを使用する必要があり、 それらは多くの場合、開発と展開がそれほど広く進んでおらず、脅威モデルと プライバシーモデルを判断するために、はるかに多くの開発と分析を必要とします。

B.3 削除

この仕様で提供される API は、 検証可能なクレデンシャル および 検証可能な 提示ストレージ・サービスから削除できるようにします。これらの削除の結果 と、それらが引き起こす可能性のある副作用は、この仕様の範囲外です。 ただし、実装者は削除を実装できるさまざまな方法を理解することが推奨されます。 この仕様で想定される削除には少なくとも 2 種類があります。

部分 削除 は、レコードに削除の印を付けますが、 元の情報の一部または全部を保存し続けます。この運用モードは、 特定の期間にわたるすべてのクレデンシャルおよび/または提示について監査要件がある場合、 または元のクレデンシャルを回復することが有用な機能として提供され得る場合に 役立つことがあります。

完全 削除 は、特定の 検証可能なクレデンシャル または 検証可能な 提示に関連するすべての情報を、回復不能な方法で 消去します。この運用モードは、古くなっており監査の必要性を超えた情報を削除する場合、 または何らかの「忘れられる 権利」要求に応答する場合に役立つことがあります。

検証可能なクレデンシャルを削除する際には、 そのステータス情報の取り扱いを考慮する必要があります。ユースケースによっては、 特定の 検証可能なクレデンシャル の削除に伴い、その検証可能なクレデンシャルの 失効ビットおよび一時停止ビットも設定し、 削除されたクレデンシャルに対するあらゆる種類のステータス確認が失敗し、 クレデンシャルの使用が停止されるようにすることが求められる場合があります。

上記のシナリオを踏まえ、実装者は、delete 後に発生するシステム・アクションを 構成可能にし、システムの柔軟性が任意の 検証可能なクレデンシャル ユースケースに対応できるようにすることが推奨されます。

B.4 ペイロードサイズ

より大きなトランザクションは DoS インシデントを引き起こす可能性があります。 エンドポイントが受け入れるペイロードサイズをインスタンス・レベルで構成することが推奨されます。

B.5 追加の検証

ほとんどの場合、単に証明を検証するだけでは、受信したデータを適切に 取り扱うには不十分な場合があります。検証者サービスは、そのユースケースに基づいて 追加の検証ステップを構成することが期待されます。このような追加の 検証を定義するために、実装者は 第2.3節: Resource Integrity および 第2.4節: Contexts and Vocabularies など、Verifiable Credential Data Integrity 1.0 仕様内の仕様を参照できます。そこには、コンテキスト処理と 完全性検証に関するさらなる情報があります。

不適切な検証は、多くの場合、セキュリティ脆弱性につながります。

追加の検証ステップは、problem details を通じて、検証応答オブジェクトを返す際に 考慮できます。

B.6 セキュア・コーディングの実践

実装者は、この仕様を実装する際に、業界標準のセキュア・コーディングの実践を使用するよう 強く求められます。非常に経験豊富なソフトウェア開発者であっても間違いを犯す可能性があり、 セキュア・コーディングのチェックリストや脆弱性スキャン・ソフトウェアを使用することで、 セキュリティ侵害につながるエラーを捕捉できます。 OWASP Secure Coding Practices Checklist OWASP Web Security Testing Guide などのチェックリストやガイドに従うことで、 安全でない実装の可能性を減らすことができます。

B.7 その他のセキュリティに関する考慮事項

この仕様で説明される 検証可能なクレデンシャル のライフサイクルを管理するインターフェイスは汎用的な性質を持つため、その使用に伴う セキュリティ上の影響は、読者にとってすぐには明らかでない可能性があります。 完全なソフトウェア・システムで考慮する必要があるかもしれない種類の セキュリティ上の懸念を理解するため、実装者は、この技術が Verifiable Credentials Data Model v2.0 仕様(特に Verifiable Credential Security Considerations の節)や、 Verifiable Credential Data Integrity 1.0 仕様(特に Data Integrity Security Considerations の節)によってどのように使用され得るかを 読むことが強く求められます。

C. ステータスリスト管理

ステータス・サービスは、ステータスリストを管理するための 3 つの主要な操作を提供します:

注記: 非規範的な ステータスリスト操作

この仕様で説明されるステータスリスト操作(リスト作成、リスト取得、 およびステータス設定)は非規範的であり、推奨される 実装アプローチを表します。ステータスリストの作成と管理は、 以下のように、この仕様で考慮されていないさまざまな要因に依存する可能性があります:

  • 発行者またはユースケースに固有のビジネス要件およびポリシー
  • リストサイズ、更新頻度、キャッシュ戦略などのパフォーマンスに関する考慮事項
  • ストレージ容量やホスティング能力を含むインフラストラクチャ上の制約
  • ステータス情報の管理方法に影響を与える可能性のある規制またはコンプライアンス要件
  • 既存のクレデンシャル管理システムまたはワークフローとの統合

結果として得られるステータス情報が、使用中のステータス・メカニズム仕様、 たとえば Bitstring Status List v1.0 仕様に従って検証可能である限り、実装者はそれぞれの具体的なニーズに応じて ステータスリスト管理システムを自由に設計できます。

プライバシーを最大化するため、検証者は、ステータス・サービスに 直接照会するのではなく、 保持者から ステータス情報を取得することが推奨されます。保持者検証可能なクレデンシャルを提示する場合、 対応するステータスリスト・クレデンシャルまたは、検証者発行者に連絡することなく 検証できる十分なステータス情報を含めることが推奨されます。この アプローチは、ステータス確認が特定の 検証者または 検証可能な クレデンシャルと相関されることを防ぎます。

C.1 ステータスリストの作成

このエンドポイントは、 検証可能な クレデンシャル のステータスを追跡するために使用できる、新しいステータスリスト・ クレデンシャルを作成するために使用されます。ステータスリストは、それ自体が 複数のクレデンシャルのステータス情報を含む 検証可能なクレデンシャル であり、プライバシーを保護するステータス確認を可能にします。ステータスリスト・ クレデンシャルは応答で返され、検証目的で公開アクセス可能にできます。

検証プロセスの一貫性のため、ステータスリスト・クレデンシャルは通常、 それにリンクされる 検証可能なクレデンシャル と同じ保護メカニズム(証明型および暗号スイート)を使用します。これにより、 検証者は同じ検証メソッドを使用して、クレデンシャルと関連するステータスリストの 両方を検証できます。

検証可能なクレデンシャル のステータスを管理する具体的なメカニズムについて、実装者は、 [VC-BITSTRING-STATUS-LIST] 仕様などの よく知られた外部仕様を参照することが推奨されます。この仕様は、ステータスリスト・ クレデンシャルを実装する方法の規範的な例を提供します。

POST /status-lists - 新しいステータスリストを作成します

/status-lists エンドポイントは、POST を受信する際に以下のスキーマを使用します:

プロパティ 説明
statusPurpose [string] ステータスリストの目的(例: "revocation"、"suspension")。これは、リストが どの種類のステータス情報を追跡するかを決定します。
id [string] ステータスリストの任意の識別子。提供されない場合、サービスが生成します。
options [object] オブジェクト

/status-lists エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
201 ステータスリストが正常に作成されました
content-type: application/json
以下の形式のオブジェクト:
verifiableCredential [object]
以下の形式のオブジェクト:
@context [array]
クレデンシャルの JSON-LD コンテキスト。@context 配列内の各項目は文字列でなければなりません(MUST)。
id [string]
クレデンシャルの ID。このプロパティは空であってもかまいません(MAY)。 Verifiable Credential は有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、発行者は、 提供されていない場合に id プロパティを自動生成すべきではありません(SHOULD NOT)。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列でなければなりません(MUST)。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトでなければなりません(MUST):
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
id [string]
作成されたステータスリスト・クレデンシャルの識別子。GET エンドポイントを介して それを取得するために使用できます。
400 Bad Request

C.2 ステータスリストの取得

このエンドポイントは、公開アクセス可能なステータスリスト・クレデンシャルを取得します。 このエンドポイントは通常、検証者保持者が ステータス情報を取得できるように、認証なしで公開アクセス可能です。

エンドポイントは、要求されたメディア型またはサービスに構成された既定の形式に基づいて、 適切な形式でステータスリスト・クレデンシャルを返します。応答は通常、 VerifiableCredential または EnvelopedVerifiableCredential のいずれかであり、 このステータスリストを参照する 検証可能なクレデンシャル で使用される形式と一致します。これにより、検証者は関連するクレデンシャルを 検証するために使用するのと同じメカニズムで、ステータスリストを処理できます。

注記: プライバシーを保護するステータス取得

プライバシーを保護するステータス・メカニズムでは、検証者は、このエンドポイントに 直接照会するのではなく、保持者からステータス 情報を取得することが推奨されます。 保持者が、 ステータス情報(credentialStatus プロパティなど)を含む 検証可能な クレデンシャルを提示する場合、 保持者は、対応する ステータスリスト・クレデンシャルまたは検証を可能にする十分なステータス情報も 提供することが推奨されます。このアプローチは、発行者がステータス確認を 特定の 検証者または検証可能な クレデンシャルと相関させることを防ぎ、それによって プライバシーを保護します。

検証者検証可能なクレデンシャルの ステータスを確認する必要がある場合、推奨されるフローは以下のとおりです:

  1. 検証者は、保持者から 検証可能な 提示を要求します。
  2. 保持者は、 対応するステータスリスト・クレデンシャルまたはステータス情報とともに、 検証可能な クレデンシャルを提示に含めます。
  3. 検証者は、 保持者から 提供された情報を使用してステータスを検証し、 発行者に直接連絡する必要はありません。

このエンドポイントは、提示に含めるステータスリスト・クレデンシャルを取得する必要がある 保持者や、プライバシーの観点から 発行者への直接連絡が許容される場合にも役立つ可能性があります。

GET /status-lists/{id} - ステータスリスト・クレデンシャルを取得します

/status-lists/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
200 ステータスリスト・クレデンシャルが正常に取得されました
content-type: application/json
以下の形式のオブジェクト:
@context [array]
クレデンシャルの JSON-LD コンテキスト。@context 配列内の各項目は 文字列でなければなりません(MUST)。
id [string]
クレデンシャルの ID。このプロパティは空であってもかまいません(MAY)。 Verifiable Credential は有効であるために id プロパティを必要とせず、 id プロパティを設定できないユースケースがあるため、発行者は、 提供されていない場合に id プロパティを自動生成すべきではありません(SHOULD NOT)。
type [array]
クレデンシャルの JSON-LD 型。type 配列内の各項目は 文字列でなければなりません(MUST)。
issuer [object]
文字列、または以下の形式のオブジェクトのいずれか:
id [string]
発行者 ID。
validFrom [string]
validFrom の日付
validUntil [string]
validUntil の日付
credentialSubject [object]
オブジェクト
proof [object]
W3C VC Data Integrity 仕様で定義される Data Integrity Proof。 これは以下の形式のオブジェクトでなければなりません(MUST):
type [string]
Data Integrity Proof の型。
cryptosuite [string]
暗号スイートの名前。
created [string]
証明が作成された日付。
nonce [string]
プライバシー目的で証明値をランダム化するために、 証明の作成者が選択した値。
verificationMethod [string]
証明を検証するために使用される検証メソッド。
proofPurpose [string]
verificationMethod とともに使用される証明の目的。
proofValue [string]
Linked Data 証明の値。
404 ステータスリストが見つかりません

C.3 ステータスの更新

このエンドポイントは、ステータスリスト内で発行済みの 検証可能なクレデンシャル のステータスを更新するために使用されます。クレデンシャルのステータスを変更する必要がある場合 (例: 失効または一時停止)、このエンドポイントはステータスリスト・クレデンシャル内の 対応するエントリーを更新します。

要求は通常、更新するクレデンシャル、ステータスリスト・エントリー情報 (ステータスリスト・クレデンシャル識別子およびそのリスト内のインデックスを含む)、 および新しいステータス値を指定します。ステータス・サービスは、それに応じて ステータスリスト・クレデンシャルを更新します。

POST /credentials/status - 発行済みクレデンシャルのステータスを更新します

/credentials/status エンドポイントは、POST を受信する際に以下のスキーマを使用します:

プロパティ 説明
credentialId [string] クレデンシャルを識別します(識別子は VC 自体に現れる必要はありません)。
credentialStatus [object] 更新する特定のステータスリスト・エントリーを識別します。これは以下の形式のオブジェクトでなければ なりません(MUST):
id [string]
type [string]
statusPurpose [string]
statusListIndex [string]
statusListCredential [string]
status [boolean] 新しいステータスを指定します。
indexAllocator [string] サービスが、どのインデックスが VC に使用/割り当てられているかを使用するためのもの。

/credentials/status エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:

応答 本文
200 クレデンシャルのステータスが正常に更新されました
400 Bad Request
404 クレデンシャルが見つかりません

D. ワークフロー・ステップとテンプレートの 例

D.1 最小実用 ステップおよびクレデンシャル・テンプレート

以下は、単一のステップを含む最小ワークフローと見なされ得るもののテンプレート例であり、 続いて最小クレデンシャルの例を示します。これらの「最小」テンプレートはいずれも、 各例で行われる認可と変数の選択に依然として依存している点に注意してください。

26: 最小ステップ・テンプレート
{
  "id": "https://localhost:18443/workflows/z19nXMUSyXawSMK6j65Vs4jb1",
  "sequence": 0,
  "controller": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
  "steps": {
    "verify": {
      "stepTemplate": {
        "type": "jsonata",
        "template": "{\"verifiablePresentationRequest\": verifiablePresentationRequest}"
      }
    }
  },
  "initialStep": "verify",
  "zcaps": {...}
}
27: 最小クレデンシャル・テンプレート
{
  "id": "https://localhost:18443/workflows/z19mYrRgRuwN9PnezmhoJhBoV",
  "sequence": 0,
  "controller": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
  "credentialTemplates": [
    {
      "type": "jsonata",
      "template": "{\"@context\": [\"https://www.w3.org/ns/credentials/v2\", \"https://www.w3.org/ns/credentials/examples/v2\"],\"type\": [\"VerifiableCredential\",\"ExampleNameCredential\"],\"credentialSubject\": {\"name\": name}}"
    }
  ],
  "steps": {
    "issue": {
      "issueRequests": [
        {
          "credentialTemplateIndex": 0,
          "result": "issuedExampleNameCredentialResult"
        }
      ]
    }
  },
  "initialStep": "issue",
  "zcaps": {...}
}

D.2 複雑な例

以下は、より複雑なワークフローの例です。

この最初の例は複数のステップを持ち、検証と発行を含み、ZCAP と OAuth2 の両方の 認可をサポートし、カスタム変数あり/なしの両方でクレデンシャル・テンプレートの 再利用を示し、提示スキーマのチェックを含みます。 この例は Verifiable Credentials Data Model 2.0(validFromhttps://www.w3.org/ns/credentials/v2)を使用します。

28: ワークフロー例 1
{
  "id": "https://localhost:18443/workflows/z19mYrRgRuwN9PnezmhoJhBoV",
  "sequence": 0,
  "controller": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
  "meterId": "https://localhost:18443/meters/z1AG3Ud3apFhGaTBfRm7KZPRY",
  "credentialTemplates": [
    {
      "id": "urn:credential-template-1",
      "type": "jsonata",
      "template": "\n  {\n    \"@context\": [\n      \"https://www.w3.org/ns/credentials/v2\",\n      'https://www.w3.org/ns/credentials/examples/v2'\n    ],\n    \"id\": credentialId,\n    \"type\": [\n      \"VerifiableCredential\",\n      \"UniversityDegreeCredential\"\n    ],\n    \"validFrom\": validFrom,\n    \"credentialSubject\": {\n      \"id\": results.verify.did,\n      \"degree\": {\n        \"type\": \"BachelorDegree\",\n        \"name\": \"Bachelor of Science and Arts\"\n      }\n    }\n  }\n"
    }
  ],
  "steps": {
    "verify": {
      "createChallenge": true,
      "verifiablePresentationRequest": {
        "query": [
          {
            "type": "DIDAuthentication",
            "acceptedMethods": [
              {
                "method": "key"
              }
            ]
          },
          {
            "type": "QueryByExample",
            "credentialQuery": [
              {
                "reason": "We require a verifiable credential to pass this test",
                "example": {
                  "@context": [
                    "https://www.w3.org/ns/credentials/v2",
                    "https://www.w3.org/ns/credentials/examples/v2"
                  ],
                  "type": "UniversityDegreeCredential"
                }
              }
            ]
          }
        ],
        "domain": "https://localhost:18443"
      },
      "presentationSchema": {
        "type": "JsonSchema",
        "jsonSchema": {
          "title": "Presentation",
          "type": "object",
          "required": [
            "@context",
            "type",
            "verifiableCredential"
          ],
          "additionalProperties": false,
          "properties": {
            "@context": {
              "type": "array"
            },
            "holder": {
              "type": "string"
            },
            "type": {
              "type": "array"
            },
            "proof": {
              "oneOf": [
                {
                  "type": "object"
                },
                {
                  "type": "array"
                }
              ]
            },
            "verifiableCredential": {
              "oneOf": [
                {
                  "title": "Strict Degree Credential",
                  "type": "object",
                  "required": [
                    "@context",
                    "type",
                    "issuer",
                    "credentialSubject"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "@context": {
                      "type": "array",
                      "items": [
                        {
                          "const": "https://www.w3.org/ns/credentials/v2"
                        },
                        {
                          "const": "https://www.w3.org/ns/credentials/examples/v2"
                        }
                      ]
                    },
                    "id": {
                      "type": "string"
                    },
                    "issuer": {
                      "const": "did:key:z6Mkjc99Z627zYQTJXTXP5ohoFnjyGP74ooyRmRYabxz8ozo"
                    },
                    "type": {
                      "type": "array",
                      "items": [
                        {
                          "const": "VerifiableCredential"
                        },
                        {
                          "const": "UniversityDegreeCredential"
                        }
                      ]
                    },
                    "validFrom": {
                      "type": "string"
                    },
                    "credentialSubject": {
                      "type": "object",
                      "required": [
                        "degree"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "degree": {
                          "type": "object",
                          "required": [
                            "type",
                            "name"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "type": {
                              "const": "BachelorDegree"
                            },
                            "name": {
                              "const": "Bachelor of Science and Arts"
                            }
                          }
                        }
                      }
                    },
                    "proof": {
                      "oneOf": [
                        {
                          "type": "object"
                        },
                        {
                          "type": "array"
                        }
                      ]
                    }
                  }
                },
                {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "title": "Strict Degree Credential",
                    "type": "object",
                    "required": [
                      "@context",
                      "type",
                      "issuer",
                      "credentialSubject"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "@context": {
                        "type": "array",
                        "items": [
                          {
                            "const": "https://www.w3.org/ns/credentials/v2"
                          },
                          {
                            "const": "https://www.w3.org/ns/credentials/examples/v2"
                          }
                        ]
                      },
                      "id": {
                        "type": "string"
                      },
                      "issuer": {
                        "const": "did:key:z6Mkjc99Z627zYQTJXTXP5ohoFnjyGP74ooyRmRYabxz8ozo"
                      },
                      "type": {
                        "type": "array",
                        "items": [
                          {
                            "const": "VerifiableCredential"
                          },
                          {
                            "const": "UniversityDegreeCredential"
                          }
                        ]
                      },
                      "validFrom": {
                        "type": "string"
                      },
                      "credentialSubject": {
                        "type": "object",
                        "required": [
                          "degree"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "degree": {
                            "type": "object",
                            "required": [
                              "type",
                              "name"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "type": {
                                "const": "BachelorDegree"
                              },
                              "name": {
                                "const": "Bachelor of Science and Arts"
                              }
                            }
                          }
                        }
                      },
                      "proof": {
                        "oneOf": [
                          {
                            "type": "object"
                          },
                          {
                            "type": "array"
                          }
                        ]
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "nextStep": "issue"
    },
    "issue": {
      "issueRequests": [
        {
          "credentialTemplateId": "urn:credential-template-1"
        },
        {
          "credentialTemplateId": "urn:credential-template-1",
          "variables": {
            "credentialId": "urn:different",
            "validFrom": "2024-01-01T00:00:00Z",
            "results": {
              "verify": {
                "did": "did:example:1"
              }
            }
          }
        }
      ]
    }
  },
  "initialStep": "verify",
  "zcaps": {
    "issue": {
      "@context": [
        "https://w3id.org/zcap/v1",
        "https://w3id.org/security/suites/ed25519-2020/v1"
      ],
      "id": "urn:uuid:560e68a8-6c39-454d-8a54-b16c7d1e35fe",
      "controller": "did:key:z6MkrFmv97wsVfa7sseVctxAEAoyUL4fpLAGMfGUbtSoC3G3",
      "parentCapability": "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fissuers%2Fz1A9Aay1eLcMPnBYEFkkqhZev",
      "invocationTarget": "https://localhost:18443/issuers/z1A9Aay1eLcMPnBYEFkkqhZev/credentials/issue",
      "expires": "2025-12-01T21:28:44Z",
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2025-12-01T21:23:44Z",
        "verificationMethod": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ#z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
        "proofPurpose": "capabilityDelegation",
        "capabilityChain": [
          "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fissuers%2Fz1A9Aay1eLcMPnBYEFkkqhZev"
        ],
        "proofValue": "z4ubKiW87sRfEqSWRwoLhPGLTMuR7VnYuGyunPkWCbc6oCqUQDQUEz4bWw3zYBWACTywWj4NyBoUJwyH9VVBYZTKY"
      }
    },
    "createChallenge": {
      "@context": [
        "https://w3id.org/zcap/v1",
        "https://w3id.org/security/suites/ed25519-2020/v1"
      ],
      "id": "urn:uuid:07537e74-25d7-49fa-9d30-28728bbb4838",
      "controller": "did:key:z6MkrFmv97wsVfa7sseVctxAEAoyUL4fpLAGMfGUbtSoC3G3",
      "parentCapability": "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1A2cLHcMzzuGT7sBZiU7AtYa",
      "invocationTarget": "https://localhost:18443/verifiers/z1A2cLHcMzzuGT7sBZiU7AtYa/challenges",
      "expires": "2025-12-01T21:28:44Z",
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2025-12-01T21:23:44Z",
        "verificationMethod": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ#z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
        "proofPurpose": "capabilityDelegation",
        "capabilityChain": [
          "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1A2cLHcMzzuGT7sBZiU7AtYa"
        ],
        "proofValue": "zydEXjYSYFVAVkoHvET2QMqsHgVqxRQoYViU6DDPRncjdSj2VAW19dAFUPBrpYBTt1kwYHeVB9HNZhoHtQL7DJ2A"
      }
    },
    "verifyPresentation": {
      "@context": [
        "https://w3id.org/zcap/v1",
        "https://w3id.org/security/suites/ed25519-2020/v1"
      ],
      "id": "urn:uuid:4f495517-f6bd-488f-b662-fa2f761ccd03",
      "controller": "did:key:z6MkrFmv97wsVfa7sseVctxAEAoyUL4fpLAGMfGUbtSoC3G3",
      "parentCapability": "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1A2cLHcMzzuGT7sBZiU7AtYa",
      "invocationTarget": "https://localhost:18443/verifiers/z1A2cLHcMzzuGT7sBZiU7AtYa/presentations/verify",
      "expires": "2025-12-01T21:28:44Z",
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2025-12-01T21:23:44Z",
        "verificationMethod": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ#z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
        "proofPurpose": "capabilityDelegation",
        "capabilityChain": [
          "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1A2cLHcMzzuGT7sBZiU7AtYa"
        ],
        "proofValue": "z3NmKFcY2o146jTgpoLi6hD6TwRV7uC2SzEQrvTQSi4Sg33xCm3jE2QtYoa5MBGFvax8DCpjpjWdzzdhXUxijXLUG"
      }
    }
  },
  "authorization": {
    "oauth2": {
      "issuerConfigUrl": "https://localhost:18443/.well-known/oauth-authorization-server"
    }
  }
}

この 2 番目の例は stepTemplate 機能を使用します。 交換を作成する際に、verifiablePresentationRequest が変数として完全な形で 提供されることを期待し、 コールバック機能を示すために callbackUrl を含みます。

29: ワークフロー例 2
{
  "id": "https://localhost:18443/workflows/z19nXMUSyXawSMK6j65Vs4jb1",
  "sequence": 0,
  "controller": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
  "meterId": "https://localhost:18443/meters/z1A7quFpnVP4NdDURjUv78JVj",
  "steps": {
    "verify": {
      "stepTemplate": {
        "type": "jsonata",
        "template": "\n          {\n            \"createChallenge\": true,\n            \"verifiablePresentationRequest\": verifiablePresentationRequest,\n            \"callback\": {\n              \"url\": callbackUrl\n            }\n          }"
      }
    }
  },
  "initialStep": "verify",
  "zcaps": {
    "createChallenge": {
      "@context": [
        "https://w3id.org/zcap/v1",
        "https://w3id.org/security/suites/ed25519-2020/v1"
      ],
      "id": "urn:uuid:103c3199-ae29-48c0-a848-61752093909c",
      "controller": "did:key:z6MkezKzgnoN3fxvdnsNhyf8wacUTLt22gg6PpXi2DRFkdBA",
      "parentCapability": "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1AG62DcvrFkaszuQmcvZ1tjp",
      "invocationTarget": "https://localhost:18443/verifiers/z1AG62DcvrFkaszuQmcvZ1tjp/challenges",
      "expires": "2025-12-01T21:32:04Z",
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2025-12-01T21:27:04Z",
        "verificationMethod": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ#z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
        "proofPurpose": "capabilityDelegation",
        "capabilityChain": [
          "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1AG62DcvrFkaszuQmcvZ1tjp"
        ],
        "proofValue": "z21ZcYeG7wPae2kvznuqH9V6S3bb3M2Zfs1cEGf4KdYnHB12AAe1to6scLCgdjyLdLM1E3uWWUupkE6xGaNzVnJis"
      }
    },
    "verifyPresentation": {
      "@context": [
        "https://w3id.org/zcap/v1",
        "https://w3id.org/security/suites/ed25519-2020/v1"
      ],
      "id": "urn:uuid:14b5563a-1f73-4c3b-9fbb-a93b11e1084d",
      "controller": "did:key:z6MkezKzgnoN3fxvdnsNhyf8wacUTLt22gg6PpXi2DRFkdBA",
      "parentCapability": "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1AG62DcvrFkaszuQmcvZ1tjp",
      "invocationTarget": "https://localhost:18443/verifiers/z1AG62DcvrFkaszuQmcvZ1tjp/presentations/verify",
      "expires": "2025-12-01T21:32:04Z",
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2025-12-01T21:27:04Z",
        "verificationMethod": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ#z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
        "proofPurpose": "capabilityDelegation",
        "capabilityChain": [
          "urn:zcap:root:https%3A%2F%2Flocalhost%3A18443%2Fverifiers%2Fz1AG62DcvrFkaszuQmcvZ1tjp"
        ],
        "proofValue": "z5pHj7SvNzB8GamN77kYLCjt66J98pHr5dqVgXpZJ7zHKnA6A2RMgVMvPAc3xxCADbuYsCgioGDPAQjvYzF9XF33u"
      }
    }
  }
}

E. 他の 仕様との関係

検証可能なクレデンシャル のライフサイクルには、 ワークフローの作成、交換に参加するための初期インタラクション、発行、 ステータス管理、ローカル・クレデンシャル管理、提示、検証、および妥当性確認が含まれます。この 仕様は、検証可能なクレデンシャル のライフサイクル 管理のための HTTP ベース API を定義し、これは 発行者保持者、および 検証者によって使用できます。 Digital Credential APIOpenID for Verifiable Credential Issuance v1.0、および OpenID for Verifiable Presentations v1.0 など、この仕様と似た機能を提供するように見える 仕様は他にもあります。この節では、この仕様の標準化の前に 検討された他の仕様と、この仕様がエコシステム内の他の仕様とどのように 異なるかを説明します。

根本的に、この仕様は 検証可能なクレデンシャルの ライフサイクル管理全体に焦点を当てた唯一の仕様です。これは、 クレデンシャル形式、クレデンシャル・クエリ言語、およびクレデンシャル配信プロトコルに依存しません。 検証可能なクレデンシャルまたは エンベロープされた 検証可能なクレデンシャルとして表現可能な任意の クレデンシャル形式を、この仕様で使用できます。同様に、 OpenID for Verifiable Credential Issuance v1.0OpenID for Verifiable Presentations v1.0 などのクレデンシャル配信プロトコルは、 この仕様で定義されるインタラクションおよび交換で使用できます。 最後に、この仕様は、技術の改善や市場分野の専門化に伴う柔軟性を提供するために、 複数のクレデンシャル・クエリ言語をサポートします。

この仕様は、検証可能なクレデンシャル ライフサイクル管理の全体に対する API を定義します。そうしなければ、ベンダー ロックインの機会が生じるためです。検証可能なクレデンシャル のライフサイクル管理全体を通じてベンダー・ロックを防ぐインターフェイスを提供する 他の仕様は存在しません。

F. IANA に関する考慮事項

この節は、この仕様が W3C Proposed Recommendation になった際に、 レビュー、承認、および IANA への登録のために Internet Engineering Steering Group (IESG) に 提出されます。

F.1 URI スキーム登録

スキーム名:
interaction
ステータス:
Permanent
このスキーム名を使用するアプリケーション/プロトコル:
この仕様の Section 3.7 インタラクションの開始
連絡先:
Ivan Herman, W3C Staff Contact
変更管理者:
W3C Verifiable Credentials Working Group
参照
VCALM v1.0

G. 謝辞

作業部会は、この仕様への貢献について以下の個人に感謝します: 謝辞の最終リストは、Candidate Recommendation フェーズの終了時に 編纂されます。

この仕様に関する作業の一部は、以下の契約に基づき、United States Department of Homeland Security の Silicon Valley Innovation Program によって資金提供されました: 70RSAT20T00000003, 70RSAT20T00000010, 70RSAT20T00000029, 70RSAT20T00000031, 70RSAT20T00000033, and 70RSAT20T00000043. この仕様の内容は、必ずしも米国政府の立場または方針を反映するものではなく、 公式な承認が推測されるべきではありません。

この仕様の開発は、 W3C Credentials Community Group によっても支援されました。同グループは以前、そのインキュベーション期間を通じて 以下の個人の組み合わせによって議長が務められていました: Kim Hamilton Duffy, Heather Vescent, Wayne Chang, Mike Prorock, Harrison Tang, Will Abramson, Mahmoud Alkhraishi, and Denken Chen.

H. 参照

H.1 規範的参照

[DCAPI]
Digital Credential API. W3C. W3C 作業草案. URL: https://www.w3.org/TR/digital-credentials/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[ISO18004]
ISO18004:2024: QR Code Bar Code Symbology Specification. ISO. Published. URL: https://www.iso.org/standard/83389.html
[OID4VCI]
OpenID for Verifiable Credential Issuance v1.0. OpenID Foundation. W3C 作業草案. URL: https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html
[OID4VP]
OpenID for Verifiable Presentations v1.0. OpenID Foundation. W3C 作業草案. URL: https://openid.net/specs/openid-4-verifiable-presentations-1_0.html
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC6749]
The OAuth 2.0 Authorization Framework. D. Hardt, Ed. IETF. October 2012. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6749/
[RFC6750]
The OAuth 2.0 Authorization Framework: Bearer Token Usage. M. Jones; D. Hardt. IETF. October 2012. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6750/
[RFC7617]
The 'Basic' HTTP Authentication Scheme. J. Reschke. IETF. September 2015. Proposed Standard. URL: https://httpwg.org/specs/rfc7617.html
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC9457]
Problem Details for HTTP APIs. M. Nottingham; E. Wilde; S. Dalal. IETF. July 2023. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9457/
[URL]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[VC-BITSTRING-STATUS-LIST]
Bitstring Status List v1.0. Manu Sporny; Dave Longley; Mahmoud Alkhraishi; Michael Prorock. W3C. 15 May 2025. W3C Recommendation. URL: https://www.w3.org/TR/vc-bitstring-status-list/
[VC-DATA-INTEGRITY]
Verifiable Credential Data Integrity 1.0. Ivan Herman; Manu Sporny; Ted Thibodeau Jr; Dave Longley; Greg Bernstein. W3C. 15 May 2025. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-integrity/
[VC-DATA-MODEL-2.0]
Verifiable Credentials Data Model v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 15 May 2025. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-model-2.0/
[VC-RECOG-ENT]
Recognized Entities v1.0. W3C. W3C 作業草案. URL: https://www.w3.org/TR/vc-recognized-entities/

H.2 参考参照

[DID-CORE]
Decentralized Identifiers (DIDs) v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 19 July 2022. W3C Recommendation. URL: https://www.w3.org/TR/did-core/
[json-schema]
JSON Schema: A Media Type for Describing JSON Documents. Austin Wright; Henry Andrews; Ben Hutton; Greg Dennis. Internet Engineering Task Force (IETF). 10 June 2022. Internet-Draft. URL: https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema
[RFC9458]
Oblivious HTTP. M. Thomson; C. A. Wood. IETF. January 2024. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9458/