Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
検証可能なクレデンシャルは、暗号学的に安全で、プライバシーを尊重し、 機械で検証可能な方法で、Web 上にクレデンシャルを表現する仕組みを提供します。 この仕様は、そのようなエコシステムで使用されるデータを発行、検証、提示、管理するための データモデルと HTTP プロトコルを提供します。
この節では、この文書の公開時点におけるステータスについて説明します。 現在の W3C 公開文書の一覧と、この技術報告書の最新改訂版は、 W3C 標準および草案 インデックスで確認できます。
この仕様は活発に開発されています。この仕様に関する活動を調整する 週次会議に参加していない限り、本番システムへの導入は推奨されません。
この文書は、検証可能なクレデンシャル・ワーキング グループによって、 勧告 トラックを使用する作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる 承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を作業中のもの以外として引用することは不適切です。
この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成されました。 W3C は、 グループの成果物に関連して行われた特許開示の公開一覧 を維持しています。そのページには、特許を開示するための手順も含まれています。 個人が、当該個人の考えでは 必須請求項 を含む特許について実際の知識を有する場合、その情報を W3C 特許ポリシー第 6 節に従って 開示しなければなりません。
この文書は、 2025年8月18日版 W3C プロセス文書に準拠します。
この節は非規範的です。
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、市場競争の向上、 およびベンダー・ロックインと切り替えコストの低減です。
この仕様には、ソフトウェア・アーキテクトおよび実装者が有用と感じる可能性のある 以下の節が含まれています。
この節は非規範的です。
Verifiable Credentials API は、以下の設計目標に向けて最適化されています。
| 目標 | 説明 |
|---|---|
| モジュール性 | 実装者は、ユースケースに必要な API のみを実装すればよく、 発行、検証、提示の間でモジュール性を実現できます。 |
| 単純性 | API の数と任意性は最小限に抑えられており、セキュリティの観点から 実装および監査しやすいものになっています。 |
| 組み合わせ可能性 | API は組み合わせ可能になるよう設計されており、少数の単純な API プリミティブを使用して 複雑なフローを実現できます。 |
| 拡張性 | API エンドポイントへの拡張は想定されており、API 設計で対応されています。 これにより、基盤 API プラットフォーム上での実験や付加価値サービスの追加が可能になります。 |
この仕様の基礎として、RESTful API アプローチが使用されました。 一部のエンドポイントでは、「コントローラー」リソース命名スタイルと呼ばれるものを使用します。 JSON 文書を記述するためのメディア型である JSON Schema は、API への受け入れ可能な入力を定義するために使用されます。
この節は非規範的です。
Verifiable Credentials Data Model は、3 つの基本的な役割、 発行者、検証者、および 保持者を定義します。
これらの各役割を果たすアクターは、検証可能なクレデンシャルを交換するための API を実現するために、 多数のソフトウェアまたはサービス・コンポーネントを使用する場合があります。
各役割は、役割固有のコーディネーター、サービス、および管理に加えて、 それぞれ専用のストレージ・サービスに関連付けられます。さらに、発行者は、発行者が発行した取消可能なクレデンシャルのための ステータス・サービスも管理できます。
任意の実装は、これらのコンポーネントの一部または全部を単一の機能的なアプリケーションに 結合することを選択できます。これらのコンポーネント間の境界とインターフェイスは、 検証可能なクレデンシャルに適合したエコシステム全体での相互運用性と代替可能性を確保するために、 この仕様で定義されます。
このアーキテクチャ的な考え方に基づくと、この API を、関連仕様のロードマップとして、 最大限の代替可能性を得るために拡張可能な方法で統合されたものとして位置付けたい場合があります。 EDV や WebKMS など、いくつかの技術は、検証可能な クレデンシャルの証明で採用されている暗号スイート・アプローチの恩恵を受ける可能性があります。 機能的に適合する任意の技術によって実現可能な汎用メカニズムを定義することで、 現在存在する機能を土台にしながら柔軟性を実現できます。このようにして、キー・サービス、 ストレージ、ステータスなどの要素がこの API の必要な部分であることを認めつつ、 それらの要素がどのように機能するかの定義を、すでに開発中の仕様や これから作成される仕様に委ねることができるかもしれません。
コンポーネントを単一のアプリに集約することに加えて、実装者は、配備されたソフトウェアの 任意の数のアクティブなインスタンス上で、任意の役割を運用することを選択できます。 たとえば、ブラウザー・ベースの保持者 コーディネーターは、Web ブラウザー、そのブラウザー内で実行されるさまざまなコード、 1 つ以上の Web サーバー(クロスオリジン AJAX またはリモート埋め込みコンテンツの場合)、 およびそのサーバー上で実行されるコードの集合体と見なされるべきです。 これらの要素はそれぞれ、異なる構成の異なるソフトウェア・パッケージとして実行され、 コンポーネント全体の機能の一部だけを実行します。この API においては、 配備アーキテクチャに関係なく、各コンポーネントはその必要な機能を全体として満たします。
非規範的と明示された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様内のそれ以外のすべては規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED、SHOULD、および 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 提供します。
この節は非規範的です。
この文書全体で使用される用語は、 Verifiable Credentials Data Model v2.0 仕様の 用語の節で定義されています。
コーディネーターは、関連付けられた役割によって設定された ビジネスルールとポリシーを実行します。多くの場合、これはその役割を担う単一の当事者のために 特別に開発されたカスタムまたはプロプライエタリなコーディネーターであり、 管理主体を検証可能なクレデンシャル エコシステムに接続する統合の接着剤です。
コーディネーターは、実装によっては視覚的なユーザー・インターフェイスを 提供する場合があります。純粋なコマンドラインまたは継続的に実行されるサービスでも、 このコンポーネントを実現できる場合があります。
ステータス・サービスを例外として、 すべての役割間通信は、特定のアクターの代理としてその役割を果たす コーディネーター間で行われます。
発行者コーディネーターは、 誰がどのクレデンシャルを取得するかに関するルールを実行します。これには、 それらのクレデンシャルを作成または受信する当事者がどのように認証および認可されるかも含まれます。 通常、発行者 コーディネーターは、 発行者のバックエンド・システムを 発行者サービスと統合します。 この統合では適切な任意の技術を使用します。発行者コーディネーターとバックエンド・サービスの間のインターフェイスは、 この仕様の範囲外です。発行者コーディネーターは、発行者サービスを駆動します。
検証者 コーディネーターは、検証者 サービスと通信し、 まず特定の検証可能なクレデンシャル または 検証可能な 提示の真正性と適時性を確認し、その後、最終的にその検証可能なクレデンシャル または 検証可能な 提示を受け入れるか拒否する前に、検証者のビジネスルールを適用します。 そのようなビジネスルールには、特定の主張の 発行者を評価すること、 または単に設定済みの許可リストを確認することが含まれる場合があります。 検証者コーディネーターは、検証可能なクレデンシャルを 検証者のポリシーに従って 検証者へ提出する API を公開します。 たとえば、検証者コーディネーターは、検証可能なクレデンシャルを 検証者の他のサービスの 現在のユーザーからのみ受け入れる場合があります。これらのルールは通常、 検証者の既存のバックエンドとの 個別の統合を必要とします。
保持者 コーディネーターは、保持者の管理下にあるクレデンシャルの流れを承認するための ビジネスルールを実行します。これは、発行者から 検証者へ至る流れです。 一部の配備では、これは個々の保持者に、 検証可能なクレデンシャルの 保管または転送を認可または承認する視覚的な方法を提供するユーザー・インターフェイスを公開することを意味します。 保持者 コーディネーターの一部の機能は、一般にデジタル・ウォレットと呼ばれます。この API では、保持者コーディネーターがすべてのフローを開始します。 それらは発行者から 検証可能なクレデンシャルを要求します。 それらは、それらの 検証可能なクレデンシャルを 検証者と共有するかどうか、 およびいつ共有するかを決定します。この API 内では、 発行者または検証者のいずれも、 検証可能なクレデンシャルの転送を 開始する方法はありません。多くのシナリオでは、保持者コーディネーターは、 個々の人間の管理下にあることが期待されており、転送を認可する段階だけであっても、 検証可能な クレデンシャルの通信に人が直接関与することを保証します。ただし、一部の 検証可能なクレデンシャルは、 個人ではなく組織に関するものです。組織に関連する 保持者コーディネーターを使用する個人がどのように関与するか、 特に、組織のクレデンシャルがそれらの組織の(法的な)代理人とどのように安全に共有され、 代理人によって提示されるかは、この仕様の範囲外です。
サービスは、 関連付けられたコーディネーターによって駆動される低レベルの 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 ワークフローの作成のように、 いくつかの構成メカニズムが提供される場所もあります。そこでは、いくつかの構成パラメーターを標準化することについて 広範な合意がありました。市場が成熟するにつれて、将来のバージョンのこの仕様では、 構成標準化の他の領域が生じる可能性があります。
この仕様で定義される API は、システム管理者によって設定された関連構成を持つ 特定のインスタンスに関連付けられていることを前提とします。 クライアントが特定のインスタンス上のエンドポイントを呼び出すと、 インスタンスは、 構成とクライアントによって提供されるオプションを使用して、そのアクションを実行します。
たとえば、/credentials/issue エンドポイントは、
/instances/12345/credentials/issue のような長い URL の末尾に提供できます。
この場合、発行に使用する暗号鍵、ステータスリストが関与するかどうか、
発行するクレデンシャルの種類、クレデンシャル形式、およびそのエンドポイントで利用可能な追加オプションを
知るように構成されているのは、その
インスタンスです。
特定のインスタンスを呼び出すソフトウェア・クライアントは、 インスタンスを構成する能力を持たない場合や、 管理者がインスタンスに対して行った設定を、その適切な利用に必要な詳細以外は認識していない場合があります。 インスタンスを構成するための 管理エンドポイントは、実装によって提供される可能性がありますが、必ずしも HTTP API として公開されるとは限りません。 構成は、構成ファイルやグラフィカル・インターフェイスを通じて行うこともできます。
コーディネーター・インスタンスは、異なるユースケース、または複雑なフローを持つユースケースを サポートするために、複数のサービス・インスタンスへアクセスできます。 サービスは配備時点でコーディネーターに知られていることが 期待されるため、サービス・インスタンス構成の実行時発見はこの仕様では定義されません。
各コーディネーターまたはサービスの インスタンスは、その動作を駆動する 特定の構成に関連付けられます。この節には、それらの構成の一部がどのように行われるかが含まれています。
任意の特定のインスタンスの
ベース URL には制限は設けられていません。この仕様全体で使用される URL パスは絶対パスとして示され、
そのベース URL はサーバーのホスト名(例:
website.example)、サブドメイン(例: api.website.example)、
またはそのドメイン内のパス(例: website.example/api)で
MAY あります。
この API は、敵対的なアクターを含む可能性のあるさまざまなネットワーク環境に配備できます。 その結果、適合するサービス実装は、特定の種類の要求を実行する際に、 適合するサービス・クライアント 実装がセキュアな認可技術を利用することを要求します。 この文書で定義される各 HTTP エンドポイントは、要求を実行する際に認可が必要かどうかを規定します。 この節で後述する禁止された認可プロトコルの種類を例外として、この API は認可メカニズムに関して 不可知です。
この API は、Verifiable Credentials の発行、所有、提示、および/または検証を必要とする 多くのシナリオで汎用的かつ有用であることを意図しています。この目的のために、 実装者は以下のユースケース分類を考慮することが推奨されます。
この節の残りでは、適合する実装での使用が検討されている認可技術の例を示します。 その他の同等の認可技術も使用できます。実装者は、非標準またはレガシーな認可技術の使用に 注意するよう促されます。
この API への要求は、その要求内にユーザー名とパスワード、または類似の値などの 長期間有効な静的クレデンシャルを含む認可プロトコルを MUST NOT 使用しません。 そのような禁止されたプロトコルの例は、HTTP Basic Authentication [RFC7617] です。
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 サイズ制限にも対応します。
既定では、大きなバイナリ値はリンクされ、ハッシュが含まれることが期待されます (そうしないプライバシー上の理由がある場合を除く)。
この節には、適合する実装を作成する際に従うべき HTTP API エンドポイント定義と実装ガイダンスが含まれています。
この節では、エンドポイントが呼び出し可能であると想定されるコンポーネントごとに、 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 インタラクション・プロトコル応答 |
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} | ステータスリスト・クレデンシャルを取得します |
このエンドポイントは、検証可能な クレデンシャルを発行するために使用されます。
application/vc 以外のメディア型、たとえば
application/mdoc、application/vc+sd-jwt、
application/vcb;barcode-format=qr_code、または
application/vcb;barcode-format=pdf417 でクレデンシャルを発行するには、
応答で EnvelopedVerifiableCredential を返すことができます。
POST /credentials/issue - クレデンシャルを発行し、それを応答本文で返します。
/credentials/issue エンドポイントは、POST を受信する際に以下のスキーマを使用します。
| プロパティ | 説明 |
|---|---|
credential [object] |
発行を意図した W3C Verifiable Credential。これは以下の形式のオブジェクトで
MUST あります。
|
options [object] |
クレデンシャルがどのように発行されるかを指定するためのオプション。
これは以下の形式のオブジェクトで MUST あります。
|
/credentials/issue エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 201 | クレデンシャルが正常に発行されました! content-type: application/json
以下の形式のオブジェクト:
|
| 400 | 次のいずれかの理由により、要求を処理できませんでした:
- 提供された 'issuer' の値が想定される構成と一致しません。
- Bad Request となる別の条件。
|
ユースケースが、発行者インスタンスに対して、提供された
credential に複数の証明を付加することを要求する場合、
そのインスタンスは /credentials/issue エンドポイントへの 1 回の呼び出しに対する
応答として、それらすべての証明を付加しなければ MUST なりません。
提供された credential がすでに 1 つ以上の証明を含んでいる場合、
その挙動は発行者インスタンスの構成によって決定されます。発行インスタンスは、
以下のいずれかの方法で既存の証明を処理するよう構成される
SHOULD です。
previousProof プロパティを使用する可能性があります。
proof 値を含む
credential 値が提供されるとエラーを返します。
使用される具体的なアプローチは、発行者インスタンスの構成と、 検証可能なクレデンシャルの想定ユースケースに依存します。
GET /credentials/{id} - ID によってクレデンシャルまたは検証可能なクレデンシャルを取得します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つクレデンシャルを 取得するには、代わりに credentialId を渡します。
/credentials/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | クレデンシャルが取得されました content-type: application/json
検証可能なクレデンシャルの正常な要求から返される形式。
これは以下の形式のオブジェクトで MUST あります。
|
| 400 | Bad Request |
| 401 | 認可されていません |
| 404 | クレデンシャルが見つかりません |
| 410 | Gone! ここにデータはありません |
| 418 | 私はティーポットです - 両当事者間で事前に取り決められたシナリオ以外では
返しては MUST なりません |
発行者サービスまたは保持者 サービスは、発行済みの検証可能な クレデンシャルを長期間保存する場合があります。これが行われる場合、 そのような検証可能な クレデンシャルを削除できることが有用な場合があります。たとえば、発行者は、 忘れられる権利などの規制上の要件により、そうする必要がある場合があります。 システムから検証可能な クレデンシャルを削除することに関連する追加の考慮事項については、 Section B.3 削除 を参照してください。
DELETE /credentials/{id} - ID によってクレデンシャルまたは検証可能なクレデンシャルを削除します。 credential.id が設定されていないが、関連付けられた credentialId 値を持つクレデンシャルを 削除するには、代わりに credentialId を渡します。
/credentials/{id} エンドポイントは、DELETE を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 202 | クレデンシャルが削除されました - ソフト削除と処理時間が想定されるため、
これは既定で 202 です |
| 400 | Bad Request |
| 401 | 認可されていません |
| 404 | クレデンシャルが見つかりません |
| 410 | Gone! ここにデータはありません |
Verifiable Credential を検証するために、以下の API が定義されています。
| エンドポイント | 説明 |
|---|---|
| POST /credentials/verify | verifiableCredential を検証し、応答本文で verificationResult を返します。 |
| POST /presentations/verify | Presentation と、それに含まれるすべての Verifiable Credentials を検証し、詳細な 検証結果を返します。 |
| POST /challenges | このエンドポイントに空の本文を渡すと、チャレンジ文字列を作成し、 応答本文で返します。 |
このエンドポイントは、検証可能な クレデンシャルを検証するために使用されます。
application/vc 以外のメディア型、たとえば
application/mdoc、application/vc+sd-jwt、
application/vcb;barcode-format=qr_code、または
application/vcb;barcode-format=pdf417 のクレデンシャルを検証するには、
要求で EnvelopedVerifiableCredential を提供できます。
POST /credentials/verify - verifiableCredential を検証し、応答本文で verificationResult を 返します。
/credentials/verify エンドポイントは、POST を受信する際に以下のいずれかのスキーマを使用します。
| プロパティ | 説明 |
|---|---|
verifiableCredential [object] |
以下の形式のオブジェクト:
|
options [object] |
クレデンシャルがどのように検証されるかを指定するためのオプション。
これは以下の形式のオブジェクトで MUST あります。
|
あるいは、/credentials/verify エンドポイントは以下のスキーマも使用できます。
| プロパティ | 説明 |
|---|---|
verifiableCredential [object] |
エンベロープされた検証可能なクレデンシャルを、検証可能な提示内の
verifiableCredential プロパティに関連付けるために使用されるオブジェクト。
これは以下の形式のオブジェクトで MUST あります。
|
options [object] |
クレデンシャルがどのように検証されるかを指定するためのオプション。
これは以下の形式のオブジェクトで MUST あります。
|
/credentials/verify エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | Verifiable Credential が正常に検証されました! content-type: application/json
VerifiableCredential に対する検証プロセスの結果を報告するオブジェクト。
これは以下の形式のオブジェクトで MUST あります。
|
| 400 | 無効な入力です! |
このエンドポイントは、検証可能な 提示と、既定ではその中に含まれるすべての検証可能な クレデンシャルを検証するために使用されます。
検証プロセスには以下が含まれます。
ビジネスルールの検証(クレデンシャル主体が提示保持者と一致することの検証、 または誰がどのクレデンシャルを提示できるかに関する認可ポリシーなど)は、 この検証エンドポイントの範囲外であり、呼び出し元アプリケーションによって実行されるべきです。
POST /presentations/verify - Presentation と、それに含まれるすべての Verifiable Credentials を検証し、 詳細な検証結果を返します。
/presentations/verify エンドポイントは、POST を受信する際に以下のいずれかのスキーマを使用します。
| プロパティ | 説明 |
|---|---|
verifiablePresentation [object] |
以下の形式のオブジェクト:
|
options [object] |
提示がどのように検証されるかを指定するためのオプション。
実装は、検証動作を制御するために追加のプロパティでこのオブジェクトを
MAY 拡張できます。一般的な拡張には、
含まれるクレデンシャルの検証を無効にするオプション(たとえばデバッグ用、
または提示レベルの検証のみが必要な場合)、ステータス確認、有効期間検証、
証明検証、スキーマ検証などのクレデンシャル側面の検証に対する細かな制御、
および提示内の特定のクレデンシャルに対する選択的な検証制御が含まれる場合があります。
クレデンシャル検証が無効化または制限される場合、この API は合成可能です。
個々のクレデンシャルは /credentials/verify エンドポイントを使用して個別に検証できます。
これは以下の形式のオブジェクトで MUST あります。
|
あるいは、/presentations/verify エンドポイントは以下のスキーマも使用できます。
| プロパティ | 説明 |
|---|---|
presentation [object] |
証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の
オブジェクトで MUST あります。
|
| プロパティ | 説明 |
|---|---|
verifiablePresentation [object] |
エンベロープされた検証可能な提示を表現するために使用されるオブジェクト。
これは以下の形式のオブジェクトで MUST あります。
|
options [object] |
提示がどのように検証されるかを指定するためのオプション。
実装は、検証動作を制御するために追加のプロパティでこのオブジェクトを
MAY 拡張できます。一般的な拡張には、
含まれるクレデンシャルの検証を無効にするオプション(たとえばデバッグ用、
または提示レベルの検証のみが必要な場合)、ステータス確認、有効期間検証、
証明検証、スキーマ検証などのクレデンシャル側面の検証に対する細かな制御、
および提示内の特定のクレデンシャルに対する選択的な検証制御が含まれる場合があります。
クレデンシャル検証が無効化または制限される場合、この API は合成可能です。
個々のクレデンシャルは /credentials/verify エンドポイントを使用して個別に検証できます。
これは以下の形式のオブジェクトで MUST あります。
|
/presentations/verify エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | 検証プロセスが正常に完了しました。応答本文には、
提示とそれに含まれるクレデンシャルが検証に合格したか失敗したかを示す
詳細な結果が含まれます。
<code>200</code> ステータスは、提示および/またはクレデンシャルが
有効または無効と判定されたかどうかに関係なく、
検証プロセス自体が成功したことを示します。
content-type: application/json
VerifiablePresentation に対する検証プロセスの結果を報告するオブジェクト。
これは以下の形式のオブジェクトで MUST あります。
|
| 400 | 検証プロセスの実行を妨げた、無効または不正な形式の入力。
これは、検証失敗ではなく、要求の形式、構造、またはパラメーターに関する
問題を示します。
|
| 413 | ペイロードが大きすぎます |
| 429 | 要求レート制限を超過しました。 |
POST /challenges - このエンドポイントに空の本文を渡すと、チャレンジ文字列を作成し、 応答本文で返します。
/challenges エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | チャレンジが作成されました content-type: application/json
challenge を含むオブジェクト。これは以下の形式のオブジェクトで
MUST あります。
|
| 400 | 無効または不正な形式の入力 |
インスタンスは、検証中に使用するためのチャレンジを作成し、そのチャレンジが
options.challenge として検証エンドポイントに渡された回数を追跡すべきです。
検証可能な クレデンシャルおよび分散型 識別子ベースの認証を扱う場合、ある当事者が別の当事者からデータを要求する必要がしばしばあります。 この節では、それらの要求の一般的な形式について説明し、具体的な検証可能な提示要求形式も提供します。
検証可能な提示要求とは、 検証者が保持者に対して 提示を求める 要求です。1 つ以上のクレデンシャルを検証可能な 提示で包んだものを要求するために、 検証者は、 保持者から受け取りたい 1 つ以上のクレデンシャルを記述する JSON 要求を構築します。要求の一般的な形式は 次のようになります。
{
// 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 オブジェクトは以下の形式です。
type プロパティを MUST 定義します。
"query by example" クレデンシャル・クエリ形式は、特定のビジネスプロセスを可能にするために、 開発者が 1 つ以上の検証可能な クレデンシャルから必要な主張を 容易に要求できるように設計されています。このクエリでは、検証者が信頼する 1 つ以上の発行者など、 その他の情報も指定できます。
QueryByExample クエリ内の credentialQuery プロパティは単一のオブジェクトです。
複数のクエリを組み合わせるための論理 "AND" および "OR" 操作は、
Section 3.4.5 クエリ内の論理演算で説明されているように、
クエリレベルの group プロパティを通じて処理されます。
同じ group 値を持つ複数のクエリは "AND" 操作として処理され、
異なる、または欠落している group 値を持つクエリは "OR" 操作として処理されます。
{
"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 なオブジェクト。
必要な主張を示すために、その @context、type、
および任意で credentialSubject フィールドを含みます。
|
| acceptedIssuers |
検証者が、
検証可能な
クレデンシャルの発行者として認識し受け入れるエンティティを識別する、
項目または項目を含むリストの OPTIONAL な配列。
各項目は、1) 受信した検証可能な
クレデンシャルの issuer プロパティ内の
発行者を識別する
[URL]、または 2) 受信した検証可能な
クレデンシャルの issuer プロパティ内の
発行者を識別する
[URL] を値とする id プロパティを含むオブジェクト、
または 3) type プロパティが
RecognizedEntityCredential に設定され、id プロパティが
Recognized Entities
v1.0
仕様で定義されるそのようなクレデンシャルを指す [URL] 値を持つオブジェクトに関連付けられた
recognizedIn プロパティを含むオブジェクトで
MUST あります。このリストには、検証者が
受け入れ可能とする認識済み発行者が含まれます。有効な例の値には以下が含まれます。
|
| acceptedCryptosuites |
検証者が
どの暗号証明スイートを受け入れるかを指定する
OPTIONAL な配列。各要素は、Data Integrity 暗号スイート名、
またはレガシー用の Ed25519Signature2020 を参照する
cryptosuite プロパティを持つオブジェクトで
SHOULD あります
(後方互換性のため、文字列値も MAY 使用され、
暗号スイート名として解釈されます)。これにより、保持者は
適切な証明形式を選択できます。このプロパティは、
エンベロープされたクレデンシャルにのみ適用される
acceptedEnvelopes とは独立して MAY 使用できます。
有効な例の値には以下が含まれます。
|
| acceptedEnvelopes |
検証者が
どのエンベロープ形式を受け入れるかを指定する
OPTIONAL な配列。各要素は、エンベロープ用の
メディア型を参照する mediaType
プロパティを持つオブジェクトで SHOULD あります
(後方互換性のため、文字列値も MAY 使用され、
メディア型として解釈されます)。これにより、保持者は、
既定の Data Integrity 形式以外の形式でクレデンシャルを提供できます。
このプロパティは、受け入れ可能な暗号スイートで署名された JSON-LD クレデンシャルにのみ
適用される acceptedCryptosuites とは独立して
MAY 使用できます。有効な例の値には以下が含まれます。
|
QueryByExample の JSON Schema は、ソフトウェア・システムへの統合用に
別ファイルで提供されています。
以下の例は、受け入れ可能な暗号スイートとエンベロープ形式を指定する QueryByExample を示し、 保持者が 適切な証明メカニズムを選択できるようにします。
{
"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-2023 と ecdsa-sd-2023 を含めることで、
検証者は
選択的開示証明が受け入れ可能であることを示し、保持者が
クレデンシャル全体ではなく birthCountry フィールドのみを開示できるようにします。
acceptedEnvelopes プロパティは、JWT ベースのエンベロープ形式も
受け入れ可能であることを示します。
Query By Example に含まれる任意のフィールドは必須フィールドです。つまり、選択的開示を可能にするために
Query By Example を使用する場合、要求者は、そのユースケースに不要なフィールドを
クエリに含めないよう注意する必要があります。Query By Example には「任意」のフィールドを示す方法はありません。
したがって、要求されているものを超える情報を応答が明らかにしないようにすることは、
クエリに応答するウォレット次第です。注記: 検証可能なクレデンシャルの一部の保護メカニズムは
選択的開示を許可しません。このような場合、要求された情報を送信するために、
要求されていない情報も送信しなければならないことがあります。デジタル・ウォレットは、
どの情報が共有されるかをユーザーに通知することが期待されています。
期待される値について何も述べずにフィールドを要求するには、要求者は要求内にそのフィールドを含め、
値を空文字列のままにできます。たとえば、要求者が名を必要とする場合、
任意の "credentialSubject" オブジェクトに単一のフィールド
"firstName": "" を含めることができます。
これにより、ウォレットは、他のフィールドを含める期待なしに、要求されたクレデンシャルの
firstName のみで応答できます。_これは、ウォレットがクエリへの応答に
追加フィールドを含めて過剰共有することを防ぐものではありません。_
選択的開示暗号スイートが受け入れ可能であることを示すために、検証者は、
acceptedCryptosuites 配列に bbs-2023 または
ecdsa-sd-2023 などの暗号スイートを含める
SHOULD です。
この節では、検証者が、 保持者に対して Decentralized Identifier ベースの認証 [DID-CORE] の実行を 要求する方法を定義します。最も単純な形式では、認証プロトコルは 検証者によるチャレンジと、 保持者による応答で構成されます。
{
"query": [{
"type": "DIDAuthentication",
"acceptedMethods": [{"method": "example"}]
}],
"challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
"domain": "example.com"
}
上記の DID Authentication 要求は、検証者が、 提供されたチャレンジに対するデジタル署名を生成することで、保持者に 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"
}
}
DID Authentication クエリ形式は、検証者が、 保持者に 特定の方法で認証するよう要求できるようにします。DID Authentication クエリは、 以下の形式で MUST あります。
| プロパティ | 説明 |
|---|---|
| type |
DIDAuthentication に設定されて MUST いる
REQUIRED な文字列値。
|
| acceptedMethods |
検証者が、
一覧にある任意の DID Method を受け入れることを表すオブジェクトの任意の配列。
配列内の各オブジェクトは、
DID Method 名を値とする method というプロパティを
MUST 含み、DID Method に固有のその他のプロパティを
MAY 含みます。有効な例の値には以下が含まれます。
|
| acceptedCryptosuites |
この検証者に
提出される暗号証明を生成する際に、保持者が
その中から MUST 選択する暗号スイートを伝える
任意のオブジェクト配列。配列内の各オブジェクトは、Data Integrity 暗号スイート名
(またはレガシー用の Ed25519Signature2020)を値とする
cryptosuite というプロパティを MUST 含み、
暗号スイートに固有のその他のプロパティを
MAY 含みます。
有効な例の値には以下が含まれます。
|
以下の例は、検証者が、 Credential Handler API (CHAPI) などの確立済み通信チャネル上で認証するために、 保持者に DID Web メソッドと Data Integrity ECDSA 暗号スイートを使用してほしいことを示します。
{
"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 エンドポイントを使用して 認証してほしいことを示しています。
{
"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"
}
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 応答を示します。
{
"@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"
}
}
Verifiable Presentation Requests では、情報の構造化と取得は論理演算の使用に依存します。 "AND" および "OR" 演算は、目的のデータへの経路を定義する上で重要な役割を果たします。
要求構造の最上位レベルでは、各クエリの group プロパティが同じ値に設定されている場合、
異なる種類のクエリは "AND" 演算として処理されることが期待されます。
この例では、group フラグが certification に設定された
2 つのクエリがあります。これは "AND" 演算となり、要求を満たすにはこれら両方の条件を
満たす必要があることを示します。
{
"query": [{
"type": "QueryByExample",
"group": "certification",
// query details ...
},
// "AND"
{
"type": "DigitalCredentialQueryLanguage",
"group": "certification",
// query details ...
}]
}
特定のクエリ型内では、group を指定しないか、互いに異なる
group 値を指定することで、"OR" 演算を適用できます。
{
"query": [{
"type": "QueryByExample",
"group": "college-degree",
// query details ...
},
// "OR"
{
"type": "DigitalCredentialQueryLanguage",
"group": "job-experience",
// query details ...
}]
}
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 はサーバーにとって意味を持ちますが、
クライアントにとっては不透明です。一部のサーバー実装がたまたま人間可読な値を使用する場合があっても、
クライアントは人間可読な値に意味を割り当てないよう強く推奨されます。
POST /credentials/derive - クレデンシャルを導出し、それを応答本文で返します。
/credentials/derive エンドポイントは、POST を受信する際に以下のスキーマを使用します。
| プロパティ | 説明 |
|---|---|
verifiableCredential [object] |
以下の形式のオブジェクト:
|
options [object] |
導出されたクレデンシャルがどのように作成されるかを指定するためのオプション。
これは以下の形式のオブジェクトで MUST あります。
|
/credentials/derive エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 201 | クレデンシャルが正常に導出されました。 content-type: application/json
以下の形式のオブジェクト:
|
| 400 | 無効な要求 |
application/vp 以外のメディア型、たとえば
application/vp+jwt で提示を作成するために、
応答で EnvelopedVerifiablePresentation を返すことができます。
POST /presentations - 提示を作成し、それを応答本文で返します。
/presentations エンドポイントは、POST を受信する際に以下のスキーマを使用します。
| プロパティ | 説明 |
|---|---|
presentation [object] |
証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の
オブジェクトで MUST あります。
|
options [object] |
DataIntegrityProof がどのように作成されるかを指定するためのオプション。
これは以下の形式のオブジェクトで MUST あります。
|
/presentations エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 201 | 提示が正常に作成されました! content-type: application/json
以下の形式のオブジェクト:
|
| 400 | 無効な入力です! |
GET /presentations - 提示または検証可能な提示の一覧を取得します
/presentations エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | 提示が取得されました content-type: application/json
配列内の各項目は、証明を持たない JSON-LD Verifiable Presentation で
MUST あります。これは以下の形式のオブジェクトで
MUST あります。
|
| 400 | Bad Request |
| 401 | 認可されていません |
| 410 | Gone! ここにデータはありません |
GET /presentations/{id} - ID によって提示または検証可能な提示を取得します
/presentations/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 200 | クレデンシャルが取得されました content-type: application/json
証明を持たない JSON-LD Verifiable Presentation。これは以下の形式の
オブジェクトで MUST あります。
|
| 400 | Bad Request |
| 401 | 認可されていません |
| 404 | 提示が見つかりません |
| 410 | Gone! ここにデータはありません |
DELETE /presentations/{id} - ID によって提示または検証可能な提示を削除します
/presentations/{id} エンドポイントは、DELETE を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 202 | 提示が削除されました - ソフト削除と処理時間が想定されるため、
これは既定で 202 です |
| 400 | Bad Request |
| 401 | 認可されていません |
| 404 | 提示が見つかりません |
| 410 | Gone! ここにデータはありません |
ワークフローは、 信頼境界をまたいで二者間で検証可能なクレデンシャルを交換するための、 特定の一連のステップを定義します。各ステップには、検証可能なクレデンシャルの 発行、検証、送信、および/または提示が関与する可能性があります。ワークフローは、 線形なステップ列と、分岐ロジックや反復ステップを含むより複雑なパターンの両方を サポートするよう設計されており、関係する当事者間の高度なインタラクションを可能にします。 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 オブジェクトで 構成されます。
redirectUrl: 別の場所でインタラクションを継続するために使用できる URL。
このユースケースの 1 つは、交換が完了した後に、交換クライアントのユーザーを
コーディネーター Web サイトへ戻すことです。
verifiablePresentation: Verifiable Presentation。これは、交換の一方の当事者が
他方の当事者へ情報を提供するために使用されます。後者がそれを要求したためである場合も、
前者が単にそれを提供している場合もあります。
verifiablePresentationRequest: Verifiable Presentation Request。これは、
交換の一方の当事者が他方の当事者から情報を要求するために使用されます。
カスタムのプロパティと値も含まれる場合がありますが、それらを認識しない実装では エラーを引き起こすことが期待されます。
この 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 パス内の特定の要素を指します。
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 あります。
|
credentialTemplates [array] |
各項目が以下の形式のオブジェクトで MUST ある配列。
|
steps [object] |
ワークフロー上で交換を完了するために必要な 1 つ以上のステップ。
steps オブジェクトを渡すことは REQUIRED です。キーは 1 つ以上のステップ名であり、
各 STEP_NAME はステップの名前(request-employee-id など)に置き換えられ、
値はステップ構成です。これは以下の形式のオブジェクトで
MUST あります。
|
/workflows エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります。
| 応答 | 本文 |
|---|---|
| 201 | ワークフローが正常に作成されました(データあり) |
| 204 | ワークフローが正常に作成されました(データなし) |
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
ワークフローには、ステップ、クレデンシャル・テンプレート、および認可に関する情報を
含めることができます。場合によっては、ワークフローがその構成内の異なる箇所
(通常はクレデンシャル・テンプレート内)で予約済みの results 変数を
参照することもあります。この変数は、交換の過程を通じてワークフロー・サービスが
クライアントから受信するデータを保持します。以下は、DID Authentication ステップと
クレデンシャル配信ステップを含む基本的なワークフロー構成です。
issueRequests 配列を含むステップには、1 つ以上の発行要求オブジェクトが含まれます。
各発行要求オブジェクトは、使用するクレデンシャル・テンプレートを、その識別子
(credentialTemplateId)またはワークフローの
credentialTemplates 配列内のインデックス(credentialTemplateIndex)のいずれかで
識別します。発行要求オブジェクトは、クレデンシャル・テンプレートを評価するときに使用される値を
提供するために、variables プロパティを MAY 含めることもできます。
既定では、各発行要求の結果は、同じステップで交換クライアントに送信される
検証可能な
提示に含まれます。発行要求オブジェクトは、任意の
result プロパティを MAY 含めることができ、
その値は、交換の variables オブジェクト内のトップレベル変数の名前、
または交換の variables オブジェクト内の任意の変数への JSON ポインターの
いずれかで MUST あり、発行要求の結果を保存する場所を識別します。
これにより、後続のステップが保存された結果を参照できる、または交換が終了し、
交換状態にアクセスできる当事者が、その結果を別の交換やその他の仕組みで使用するために
取得できるため、より大きな合成性が可能になります。
{
"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"
}
ステップは、そのステップで使用される検証可能な
提示を明示的に表現するために、verifiablePresentation を
MAY 含めることができます。この提示は、交換内の他の変数を介して構成でき、
そのステップ中に(issueRequests に従って)発行される可能性のある追加の
検証可能な
クレデンシャルで拡張することもできます。これは、特定の
検証可能な
提示のバージョンが必要なユースケース、特定のサブタイプの
検証可能な
提示が必要なユースケース、または特定の
検証可能な
提示の内容が必要なユースケースをサポートします。これには、ワークフロー・ステップで
配信されるべき、以前に帯域外で発行された検証可能な
クレデンシャルも含まれます。
ステップは、別の場所でインタラクションを継続するために使用できる URL を
クライアントへ送信することを指定するために、redirectUrl を
MAY 含めることができます。
このユースケースの 1 つは、交換が完了した後に、交換クライアントのユーザーを
コーディネーター Web サイトへ戻すことです。別のユースケースは、クライアントが
Web ブラウザーへ移動することを要求せずに、サーバーが継続中のインタラクション中に
カスタム・ビジネスルールを実装できるようにする
インタラクション URLを返すことです。
たとえば、最初の交換がユーザーから情報を要求し、その後
redirectUrl を介してインタラクション URLを返す場合があります。
クライアント(たとえばデジタル・ウォレット)は、それがインタラクション URL
(たとえば URL が ?iuv=1 を使用する)であると判断して取得でき、
その結果、インタラクション・サーバーはカスタム・ビジネスロジックを実行し、
その後インタラクションを継続するための別の交換を含むプロトコル・オブジェクトを返します。
一部のワークフローでは、その 1 つ以上のステップでカスタム変数を参照する必要があります。
この場合、コーディネーターは交換を作成するときに、その変数に適切な値を提供する必要があります。
以下は、テンプレート化された DID Authentication ステップを持つワークフロー構成の例です
(didAuthRequest ステップで参照されている
verifiablePresentationRequest 変数と callbackUrl 変数に注意してください)。
{
"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 オプション、特に createAuthorizationRequest と
authorizationRequest の値については、開発者が 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"
}
GET /workflows/{localWorkflowId} - 既存のワークフローの構成を取得し、応答本文で返します。
/workflows/{localWorkflowId} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | ワークフロー構成が取得されました! content-type: application/json
ワークフローに関する情報を含むオブジェクト。これは以下の形式のオブジェクトで
MUST あります:
|
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
交換には expires プロパティが関連付けられており、
交換の有効期限日時を示します。これは
/workflows/{localWorkflowId}/exchanges エンドポイントを使用して作成されます。
これは、そのような交換に関連付けられたチャレンジの有効期間に影響します。
チャレンジが交換に結び付けられている場合、そのチャレンジは交換の
expires プロパティで参照される日時に有効でなくなります。
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"
]
}
} または以下の形式のオブジェクト:
|
/workflows/{localWorkflowId}/exchanges エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 201 | 交換が正常に作成されました(データあり) |
| 204 | 交換が正常に作成されました(データなし) |
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
このエンドポイントは、クライアントが、交換がサポートするすべてのプロトコルを その交換に照会するための仕組みを提供します。単一の交換は、 デジタル・ウォレットへの検証可能な クレデンシャルの発行など、交換の目標を達成できる多くのプロトコルを サポートできます。
GET /workflows/{localWorkflowId}/exchanges/{localExchangeId}/protocols - 特定の交換とやり取りするために サポートされるプロトコルを取得します。
/workflows/{localWorkflowId}/exchanges/{localExchangeId}/protocols エンドポイントは、GET を受信する際に 以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | 交換が理解するプロトコル。 content-type: application/json
特定の交換を実行するために使用できるプロトコルに関する情報を含むオブジェクト。
これは以下の形式のオブジェクトで MUST あります:
|
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
このエンドポイントはまた、Web サイト運営者が、HTTPS ドメインを通じてその信頼を委任することで、
サービス・プロバイダーなどの第三者に交換を実行する権限を委任できるようにします。
たとえば、Web サイト brand.example は、プロトコル一覧で
saas.example ドメインを使用することにより、交換の運用をパートナー
saas.example に委任できます。
これにより、クライアントは brand.example への信頼に基づいて、
Web サイトが Web ページをレンダリングするために他のドメインのリソースへリンクするのと同じ方法で、
交換の運用を第三者に委任できます。
サーバーは、交換メッセージに 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 あります:
|
referenceId [string] |
サーバーが以前に referenceId を送信した場合、クライアントはデバッグと メッセージ相関を支援するために、ここにそれを含めるべきです(SHOULD)。 値は urn:uuid 値であるべきです(SHOULD)。 |
| プロパティ | 説明 |
|---|---|
verifiablePresentation [object] |
以下の形式のオブジェクト:
|
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
以下の形式のオブジェクト:
|
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
GET /workflows/{localWorkflowId}/exchanges/{localExchangeId} - 既存の交換の状態を取得し、 応答本文で返します。
/workflows/{localWorkflowId}/exchanges/{localExchangeId} エンドポイントは、GET を受信する際に 以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | 交換構成が取得されました! content-type: application/json
アクティブな交換に関する情報を含むオブジェクト。指定された交換に送信する
VP も redirectUrl もない場合、これは空のオブジェクトになることがあります。
これは以下の形式のオブジェクトで MUST あります:
|
| 400 | 無効な入力 |
| 401 | 認可されていません |
| 500 | 内部エラー |
POST /callbacks/{localCallbackId} - 交換ステップが実行されたときに通知を受けられる、 任意のケイパビリティ URL(すなわち、推測が実行困難な URL)になり得るコールバック。 この URL は、認可トークン、定期的なトークン更新、またはクライアント登録を必要とせずに、 URL が共有された当事者だけが使用できることを保証するため、ケイパビリティ URL である SHOULD です。提案された "localCallbackId" を含む URL 形式を使用する場合、 "localCallbackId" 値は、完全なコールバック URL をケイパビリティ URL として扱えることを保証するために、 少なくとも 128 ビットのランダム情報を表現しなければなりません。また、交換ごとに新しい ケイパビリティ URL を作成し、その交換でのみ使用することも推奨されます。
/callbacks/{localCallbackId} エンドポイントは、POST を受信する際に以下のスキーマを使用します:
| プロパティ | 説明 |
|---|---|
event [object] |
コールバックに関連付けられたイベント情報。これは以下の形式のオブジェクトで
MUST あります:
|
/callbacks/{localCallbackId} エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | コールバック・データを受信しました。 |
| 400 | コールバック・データは受信されませんでした。 |
この仕様の API により、非仲介型(自動化された、マシン間)または仲介型(人間が関与する) 交換を実行できます。これらの交換は、保持者 コーディネーターによって開始され、 交換を実装する任意のコーディネーターによって応答されます。フローは以下の ステップで構成されます:
保持者コーディネーターは、実際に交換を開始する前に、 特定のエンドポイント上で保持者コーディネーターが コーディネーターのプロトコル要件をサポートするかどうかを判断するために、 コーディネーターの交換発見エンドポイントを呼び出しても MAY かまいません。
上記で概説したステップの図を以下に示します:
上記の一般的な交換は、完全に自動化された方法、人間によって仲介される方法、 または一部は自動化されるが特定の段階で人間の介入が必要となるハイブリッドな方法で 実行できます。上記の 2 番目のステップは、次のステップが自動化されているか、 個人の介入を必要とするかについての指針を提供するために使用されます。
以下の図は、保持者 コーディネーターが Verifiable Presentation Request で開始し、 続行する前に受信側コーディネーターからのクレデンシャルを要求する交換を示しています:
以下の図は、保持者 コーディネーターがサーバーの最初の要求を受信した後に反対要求を送信する交換を示しています:
以下の例は、交換クライアントが、受け入れる暗号証明形式とエンベロープ型を指定する
verifiablePresentationRequest を用いて交換を開始することを示します。
credentialQuery プロパティが存在しない場合、交換クライアントは、
指定された形式に一致する、ワークフロー・サービスからの任意のクレデンシャルを受け入れます。
{
"verifiablePresentationRequest": {
"query": [{
"type": "QueryByExample",
"credentialQuery": {
"acceptedCryptosuites": [
{"cryptosuite": "eddsa-rdfc-2022"},
{"cryptosuite": "ecdsa-rdfc-2019"},
{"cryptosuite": "bbs-2023"}
],
"acceptedEnvelopes": [
{"mediaType": "application/jwt"}
]
}
}]
}
}
以下の例は、交換クライアントが後続の要求を満たす前に、ワークフロー・サービスから クレデンシャルを要求することを示します。このシナリオでは、交換クライアントは、 個人情報を共有する前に、サーバー運用者が登録済み事業者であることの証明を要求します。
{
"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"}
]
}
}]
}
}
ある実装が、それとのインタラクションをどのように開始するかを 別の実装へ伝達できることは有用です。このブートストラップ処理は、 インタラクションを開始すると呼ばれ、 各実装がどのプロトコルをサポートするか、およびその実装との特定の インタラクションをどのように開始するかを伝達します。
この文書にはいくつかのインタラクション仕様が含まれていますが、一般的な アプローチは、ユースケース、アプリケーション、およびプロトコルに依存しません。 このアプローチは、Web ブラウザー、QR コード(光学媒体)、または NFC(無線媒体)などの任意の伝送媒体を通じて、特定のプロトコルへ ブートストラップすることを望む 2 つ以上のアプリケーションをペアリングするために 使用できます。そのプロトコルがこの API を含む必要はありません。
以下のシーケンス図は、発行者がインタラクション
URL を生成し、QR コードを使用してそれを保持者と共有し、
vcapi プロトコルで進行することを概説しています:
以下のシーケンス図は、検証者がインタラクション
URL を生成し、QR コードを使用してそれを保持者と共有し、
vcapi プロトコルで進行することを概説しています:
以下のシーケンス図は、保持者がインタラクション
URL を生成し、
QR コードを使用してそれを検証者と共有し、
inviteRequest プロトコルで進行することを概説しています:
インタラクション
URL の形式は、
URL Standard
の構文に適合しなければ MUST ならず、
インタラクション URL のバージョン番号を符号化する iuv クエリパラメーターを含まなければ
ならず、この API のこのバージョンを使用する場合、その値は 1 でなければ
MUST なりません。
インタラクション URL は、インタラクション固有の識別子を含む HTTPS URL であるべき
SHOULD です。URL は不透明であるべきであり、
受信側システムによって取得される前に URL 構文処理を必要とすべきでは
SHOULD ありません。
そのような URL の例を以下に示します:
https://app.example/interactions/z8n38Dp7a?iuv=1
長いプロトコル固有情報を URL に符号化するプロトコルは、 ソフトウェア・ライブラリによって URL の最大許容長に課される制限の影響を受けます。 執筆時点では、推奨される URL 長の上限はおよそ 2,000 文字です。 実装者は、Section 3.7.4 インタラクション・プロトコル応答で定義される、 インタラクション URL に対する GET 要求への応答で表現できる情報を、 インタラクション URL のクエリパラメーターに入れるべきでは SHOULD NOT ありません。
コーディネーターは、消費側ソフトウェアによって(iuv クエリパラメーターを除き)
不透明なものと見なされることが期待されるため、自身の Web オリジン上の任意の場所に
インタラクション URL を配置する自由があります。
ただし、インタラクション URL がコーディネーター上でホストされ、ワークフロー・サービスで
ホストされないことが重要です。これにより、コーディネーターの Web オリジン
(DNS ドメイン名)を、消費者にとって一貫した信頼シグナルとして使用でき、
アクションを調整する可能性のあるビジネスルールを適用できます。
インタラクション QR コード は、 ISO18004:2024: QR Code Bar Code Symbology Specification に従って QR コードとして表現された インタラクション URL でなければ MUST なりません。広範な相互運用性を確保するために、 インタラクション URL の長さは 可能な限り短いべきであり SHOULD、400 英数字を超えるべきではなく SHOULD NOT、4,296 英数字を超えては MUST NOT なりません。インタラクション QR コードの例は 以下で確認できます:
https://app.example/interactions/z8n38Dp7a?iuv=1 のインタラクション QR コード
インタラクション URL を処理できるアプリケーションを
呼び出せることは有用です。この節では、この目的のために
interaction: プロトコル・スキーム形式を定義します。
プロトコル・スキームの形式は、以下の構文に適合しなければ
MUST なりません:
| インタラクション・プロトコル・スキーム |
|---|
scheme = "interaction:" interaction-url interaction-url = URL |
interaction-url は、URL Standard
に適合し、その URL にあるリソースを取得すると
インタラクション・プロトコル応答となる任意の URL です。
interaction:https://app.example/interactions/z8n38Dp7a?iuv=1
インタラクション URL を取得すると、 リモート・システムとのインタラクションを開始する方法に関する指示が得られます。
インタラクション URL が
application/json の Accept ヘッダーを使用して取得される場合、
protocols map を含む
単一の JSON オブジェクトが返されなければ MUST
ならず、各 key
はプロトコル識別子であり、各
value は
インタラクションを開始するために使用できる URL です。たとえば、
https://app.example/interactions/z8n38Dp7a?iuv=1
インタラクション
URL に対して HTTP GET を実行すると、
以下のいずれかの応答となる場合があります:
{
"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'"
}
}
{
"protocols": {
"inviteRequest": "https://saas.example/interactions/123/invite-request/response"
}
}
プロトコル応答により、交換プロトコルの取得節で
説明されている委任メカニズムと同様に、HTTPS ドメイン信頼モデルを通じて、
プロトコル実行を第三者サービス・プロバイダーに委任できます。たとえば、
Web サイト app.example は、プロトコルのリストに
saas.example ドメインを含めることで、交換の運用をパートナー
saas.example に委任できます。
インタラクション URL が認識されない
Accept ヘッダーを使用して取得される場合、
インタラクション URL の処理方法を理解する特定のソフトウェアを使用するよう人間に指示する
説明を含む text/html 文書が返されなければ
MUST なりません。
一部のコーディネーター実装は、プロトコル・エンドポイントを交換インスタンスの
プロトコル・エンドポイントへのパススルーとして実装します。たとえば、
https://app.example/interactions/z8n38Dp7a?iuv=1 に対する GET は、
https://app.example/workflows/123/exchanges/987/protocols に対する
パススルー GET となり、上記の応答を返すことがあります。この方法で
インタラクション URL を実装すると、より容易な実装経路を提供できます。
inviteRequest インタラクション・プロトコルは、ローカル・システムがリモート・システムに対して、
特定の URL を通じてリモート・システムへの招待を望んでいることを知らせるために使用されます。
たとえば、個人がユースケース固有のインタラクションに参加できる Web サイトなどです。
inviteRequest インタラクション・プロトコルが選択された場合、ローカル・システムは
HTTP POST を使用してデータを送信し、個人をどこへ送るべきかをリモート・システムに指示します。
POST データの例を 2 つ以下に示します。
これらの例は、この仕様が "url" フィールドの形式についていかなる要件も述べていない一方で、
このインタラクション・メカニズムの実装者に一意な ID を使用することを推奨している点を
強調することを意図しています:
{
"url": "https://website.example/checkout/8372974",
"purpose": "Checkout at ShopCo",
"referenceId": "417bcaf2-14d9-11f0-99d7-9f094678517b"
}
{
"url": "https://website.example/forms/7864165",
"purpose": "Fill out online form",
"referenceId": "d4a6e5b8-1715-4654-8e47-e68b311756d1"
}
vcapi インタラクション・プロトコルは、Section 3.6.5
交換への参加で説明されている、特定の
交換
を開始するために使用されます。
{
"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"
}
}
実装が文書の処理中に異常を検出した場合、 ProblemDetails オブジェクトを使用して、その問題を他の ソフトウェア・システムへ報告できます。これらのオブジェクトのインターフェイスは、 データを符号化するために [RFC9457] に従います。ProblemDetails map は、以下の プロパティで構成されます:
type key
は存在しなければ MUST ならず、その値は問題の型を識別する
URL でなければ MUST なりません。
title key
は、問題に関する短いが具体的な人間可読
文字列を提供すべき SHOULD です。
detail key
は、問題に関する
より長い人間可読文字列を提供すべき SHOULD です。
detail や instance などの
key
を活用して、エラーに関するより文脈的なフィードバックを提供することが推奨されます。
ただし、セキュリティ上の懸念を意識し、機密情報を開示しないようにする必要があります。
この仕様では、以下の問題記述型を定義します:
実装によって報告される可能性のある 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."
}
上記の例の type URL は、VCDM v2.0 がグローバル標準になった後、
将来的に機能するようになります。エラーが適切な場所にリンクすることを確実にするため、
当面は https://www.w3.org/TR/vc-data-model のベース URL を
www.w3.org/TR/vc-data-model-2.0 に置き換えることができます。
実装者は、本番環境におけるすべてのサーバー・エラーをサニタイズすることを 強く推奨されます。そうしないと、情報漏えいにつながる可能性があります。
検証の実行中にエラーを発生させることは避け、代わりに 検証結果に含める ProblemDetails オブジェクトを収集することが推奨されます。
この仕様は、検証エラーと検証警告の区別を定義します。
エラーは、暗号、データモデル、および不正な形式のコンテキストに関連する
ProblemDetails であり、回復不能です。警告は、
ステータスと有効期間に関連する ProblemDetails であり、
回復可能な場合があるか、または後続のアクションをアプリケーションの裁量に
委ねる場合があります。
エラーが含まれる場合、VerificationResponse オブジェクトの
verified プロパティは false に設定されなければ
MUST ならず、エラーが含まれない場合は
true に設定されなければ MUST なりません。
{
"verified": false,
"document": verifiableCredential,
"mediaType": "application/vc",
"controller": issuer,
"controllerDocument": didDocument,
"warnings": [ProblemDetails],
"errors": [ProblemDetails]
}
検証可能なクレデンシャル [VC-DATA-MODEL-2.0] は、誤用や詐欺のリスクを 軽減するように設計された標準データ モデルです。データモデルとして、検証可能な クレデンシャル はプロトコル中立であり、少なくとも 2 種類の エンティティを考慮します: 発行者 と 主体。 検証可能な クレデンシャル の主体が自然人である、または自然人に関連付けられている場合、 標準化された 検証可能なクレデンシャル の処理が、それらのアナログな 先行物と比べてはるかに効率的であることにより、プライバシーと人権に 影響が及ぶ可能性があります。
検証可能な クレデンシャル を発行するための標準化された API とプロトコルという形の技術は、 検証可能なクレデンシャル の処理効率をさらに高め、予期しないプライバシーおよび 人権上の結果に関するリスクを増大させます。
検証可能なクレデンシャル の発行には、要求フェーズと配信フェーズがあります。 要求は 主体 または別の役割によって行われる可能性があり、 配信は、主体によって制御されている場合も、そうでない場合もあるクライアントに対して 行われる可能性があります。委任はどちらのフェーズにも非常に関連します。発行者 は、要求の処理を 別のエンティティに委任する可能性があります。主体もまた、自らの側で、 検証可能なクレデンシャル を要求する能力を別の エンティティに委任する可能性があります。主体が常に委任を実行する能力または 手段を持つとは限らない点に注意してください。例には、新生児、ペット、認知症の 人が含まれます。そのため、要求は主体によって委任されていない第三者によって 実行される可能性があります。委任できる能力は、検証可能なクレデンシャル の処理効率向上における第三の次元であり、 プライバシーと人権に影響を与えます。
この仕様で説明されるアーキテクチャは、効率性とプライバシーおよび人権の尊重の 組み合わせを通じて市場に受け入れられるように設計されています。 検証可能なクレデンシャル を処理するための API とプロトコルは、 発行者ロールによる委任を、主体ロールによる委任より優先しません。
検証者が、特定の 発行者に 検証可能なクレデンシャル について問い合わせることは、 プライバシー上の悪い慣行と見なされます。この慣行は「phoning home」として知られており、 保持者、発行者、 検証者、および 検証可能なクレデンシャルに表現される その他の当事者の間で、プライバシー期待の不一致を招く可能性があります。 Phoning home により、発行者 は、気付いていない当事者を 特定の 検証可能なクレデンシャル の使用と相関させることができ、これは それらのクレデンシャルの使用に関して各エンティティが持つ可能性のある プライバシー期待に違反し得ます。たとえば、保持者が 自分と検証者の間の私的なインタラクションであると 期待しているものが、発行者に そのインタラクションが通知されるものになります。
プライバシーを保護する方法で 発行者 に問い合わせることが、 保持者 のプライバシー期待を支える インタラクションもあります。たとえば、グループ・プライバシーを提供する ステータスリストを通じるなど、プライバシーを尊重する方法で失効ステータス情報を得るために 発行者に問い合わせることは、 ステータスリストの取得に基づいて、どの 検証可能なクレデンシャル が照会されているかを発行者が特定できない限り、 許容され得ます。そのようなメカニズムの詳細については、 Bitstring Status List v1.0 仕様を参照してください。
検証者は、 プライバシー侵害を生み出す方法で「phone home」しないよう強く求められます。 検証可能なクレデンシャルからリンクされた コンテンツを取得する際には、Oblivious HTTP などのメカニズムを使用し、 結果を積極的にキャッシュすることで、エコシステムのプライバシー特性を 改善できます。
デジタル・ウォレット・ソフトウェアなどの 保持者コーディネーター実装は、 ソフトウェアが理解していない証明を含む 検証可能なクレデンシャル を受信して保存できますが、これらの証明は 実装によって提示されるべきではありません。複数の証明を持ち、その一部を 実装が理解し、その他を理解しない 検証可能なクレデンシャルは、 選択された証明を実装が理解しており、他の証明が提示前に削除される場合に限り、 実装によって提示できます。実装は理解している証明の許可リストを維持し、 存在してはならない証明が 提示前に取り除かれることを保証します。
実装は、未知の証明の存在を、 分散型エコシステムにおける潜在的な採用シグナルとして使用できます。また、実装者が 三者モデルにおいて、保持者 コーディネーターが発行者と検証者の間の導管として機能し、 保持者 コーディネーターが必ずしも特定の検証や証明を実装していない場合でも、 両者の間の相互運用性を可能にすることを理解することも重要です。別の分野の例として: 「Web ブラウザーは、自らの PDF リーダー機能を追加する前から PDF ファイルを ダウンロードして保存できていました」— この種の分散型イノベーション、相互運用性、 および漸進的強化は、三者モデルにおいて、またより一般にはスケーラブルな分散型エコシステムにおいて 重要です。また、現在のソフトウェアがまだ理解していない証明を少なくとも 1 つ持つ 検証可能なクレデンシャル を保存するためだけに、特定の新しく異なるソフトウェアの採用を人々に強制しないことで、 中央集権化を減らす助けとなることも重要です。
保持者コーディネーターは、検証するためのソフトウェアを
持っていない場合でも、いくつかの証明を提示できる可能性がありますが、
これは推測ではなく、確実に理解されている必要があります。つまり、
保存された検証可能なクレデンシャルのコピーを
提示に追加する際、
保持者ソフトウェアは、
安全に提示できると明示的に知っていない証明を
削除する必要があります。ソフトウェアが安全に提示できると明示的に知っている
証明は残すことができます。
たとえば、ecdsa-rdfc-2019
証明は検証できるが、
ecdsa-jcs-2019 証明は検証できない
デジタル・ウォレットでも、どちらかを提示できる場合があります。
選択的開示selective disclosure
および/またはリンク不能開示unlinkable disclosure
機能を提供するものなど、その他の証明は、
変換(つまり、
基本証明が派生証明と「reveal document」に変換されること)を必要とし、
したがって、ウォレットが証明を導出する手順を実装していない限り、ウォレットはこれらの
提示や証明を行うことはできません。
ウォレットが誤って基本証明を提示しないことは極めて重要です。なぜなら、それには
保持者にとって秘密である情報が
含まれる可能性があるためです。
この仕様は、以下の理由により、インタラクション URL に HTTPS を使用することを 強く推奨します:
HTTPS 信頼モデルに根ざしていないプロトコル・スキームを使用するには、 別個の暗号化プロトコル、鍵管理、および信頼モデルを使用する必要があり、 それらは多くの場合、開発と展開がそれほど広く進んでおらず、脅威モデルと プライバシーモデルを判断するために、はるかに多くの開発と分析を必要とします。
この仕様で提供される API は、 検証可能なクレデンシャル および 検証可能な 提示 を ストレージ・サービスから削除できるようにします。これらの削除の結果 と、それらが引き起こす可能性のある副作用は、この仕様の範囲外です。 ただし、実装者は削除を実装できるさまざまな方法を理解することが推奨されます。 この仕様で想定される削除には少なくとも 2 種類があります。
部分 削除 は、レコードに削除の印を付けますが、 元の情報の一部または全部を保存し続けます。この運用モードは、 特定の期間にわたるすべてのクレデンシャルおよび/または提示について監査要件がある場合、 または元のクレデンシャルを回復することが有用な機能として提供され得る場合に 役立つことがあります。
完全 削除 は、特定の 検証可能なクレデンシャル または 検証可能な 提示に関連するすべての情報を、回復不能な方法で 消去します。この運用モードは、古くなっており監査の必要性を超えた情報を削除する場合、 または何らかの「忘れられる 権利」要求に応答する場合に役立つことがあります。
検証可能なクレデンシャルを削除する際には、 そのステータス情報の取り扱いを考慮する必要があります。ユースケースによっては、 特定の 検証可能なクレデンシャル の削除に伴い、その検証可能なクレデンシャルの 失効ビットおよび一時停止ビットも設定し、 削除されたクレデンシャルに対するあらゆる種類のステータス確認が失敗し、 クレデンシャルの使用が停止されるようにすることが求められる場合があります。
上記のシナリオを踏まえ、実装者は、delete 後に発生するシステム・アクションを 構成可能にし、システムの柔軟性が任意の 検証可能なクレデンシャル ユースケースに対応できるようにすることが推奨されます。
より大きなトランザクションは DoS インシデントを引き起こす可能性があります。 エンドポイントが受け入れるペイロードサイズをインスタンス・レベルで構成することが推奨されます。
ほとんどの場合、単に証明を検証するだけでは、受信したデータを適切に 取り扱うには不十分な場合があります。検証者サービスは、そのユースケースに基づいて 追加の検証ステップを構成することが期待されます。このような追加の 検証を定義するために、実装者は 第2.3節: Resource Integrity および 第2.4節: Contexts and Vocabularies など、Verifiable Credential Data Integrity 1.0 仕様内の仕様を参照できます。そこには、コンテキスト処理と 完全性検証に関するさらなる情報があります。
不適切な検証は、多くの場合、セキュリティ脆弱性につながります。
追加の検証ステップは、problem details を通じて、検証応答オブジェクトを返す際に 考慮できます。
実装者は、この仕様を実装する際に、業界標準のセキュア・コーディングの実践を使用するよう 強く求められます。非常に経験豊富なソフトウェア開発者であっても間違いを犯す可能性があり、 セキュア・コーディングのチェックリストや脆弱性スキャン・ソフトウェアを使用することで、 セキュリティ侵害につながるエラーを捕捉できます。 OWASP Secure Coding Practices Checklist や OWASP Web Security Testing Guide などのチェックリストやガイドに従うことで、 安全でない実装の可能性を減らすことができます。
この仕様で説明される 検証可能なクレデンシャル のライフサイクルを管理するインターフェイスは汎用的な性質を持つため、その使用に伴う セキュリティ上の影響は、読者にとってすぐには明らかでない可能性があります。 完全なソフトウェア・システムで考慮する必要があるかもしれない種類の セキュリティ上の懸念を理解するため、実装者は、この技術が Verifiable Credentials Data Model v2.0 仕様(特に Verifiable Credential Security Considerations の節)や、 Verifiable Credential Data Integrity 1.0 仕様(特に Data Integrity Security Considerations の節)によってどのように使用され得るかを 読むことが強く求められます。
ステータス・サービスは、ステータスリストを管理するための 3 つの主要な操作を提供します:
この仕様で説明されるステータスリスト操作(リスト作成、リスト取得、 およびステータス設定)は非規範的であり、推奨される 実装アプローチを表します。ステータスリストの作成と管理は、 以下のように、この仕様で考慮されていないさまざまな要因に依存する可能性があります:
結果として得られるステータス情報が、使用中のステータス・メカニズム仕様、 たとえば Bitstring Status List v1.0 仕様に従って検証可能である限り、実装者はそれぞれの具体的なニーズに応じて ステータスリスト管理システムを自由に設計できます。
プライバシーを最大化するため、検証者は、ステータス・サービスに 直接照会するのではなく、 保持者から ステータス情報を取得することが推奨されます。保持者が 検証可能なクレデンシャルを提示する場合、 対応するステータスリスト・クレデンシャルまたは、検証者が発行者に連絡することなく 検証できる十分なステータス情報を含めることが推奨されます。この アプローチは、ステータス確認が特定の 検証者または 検証可能な クレデンシャルと相関されることを防ぎます。
このエンドポイントは、 検証可能な クレデンシャル のステータスを追跡するために使用できる、新しいステータスリスト・ クレデンシャルを作成するために使用されます。ステータスリストは、それ自体が 複数のクレデンシャルのステータス情報を含む 検証可能なクレデンシャル であり、プライバシーを保護するステータス確認を可能にします。ステータスリスト・ クレデンシャルは応答で返され、検証目的で公開アクセス可能にできます。
検証プロセスの一貫性のため、ステータスリスト・クレデンシャルは通常、 それにリンクされる 検証可能なクレデンシャル と同じ保護メカニズム(証明型および暗号スイート)を使用します。これにより、 検証者は同じ検証メソッドを使用して、クレデンシャルと関連するステータスリストの 両方を検証できます。
検証可能なクレデンシャル のステータスを管理する具体的なメカニズムについて、実装者は、 [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
以下の形式のオブジェクト:
|
| 400 | Bad Request |
このエンドポイントは、公開アクセス可能なステータスリスト・クレデンシャルを取得します。 このエンドポイントは通常、検証者と 保持者が ステータス情報を取得できるように、認証なしで公開アクセス可能です。
エンドポイントは、要求されたメディア型またはサービスに構成された既定の形式に基づいて、
適切な形式でステータスリスト・クレデンシャルを返します。応答は通常、
VerifiableCredential または EnvelopedVerifiableCredential のいずれかであり、
このステータスリストを参照する
検証可能なクレデンシャル
で使用される形式と一致します。これにより、検証者は関連するクレデンシャルを
検証するために使用するのと同じメカニズムで、ステータスリストを処理できます。
プライバシーを保護するステータス・メカニズムでは、検証者は、このエンドポイントに
直接照会するのではなく、保持者からステータス
情報を取得することが推奨されます。
保持者が、
ステータス情報(credentialStatus プロパティなど)を含む
検証可能な
クレデンシャルを提示する場合、
保持者は、対応する
ステータスリスト・クレデンシャルまたは検証を可能にする十分なステータス情報も
提供することが推奨されます。このアプローチは、発行者がステータス確認を
特定の 検証者または検証可能な
クレデンシャルと相関させることを防ぎ、それによって
プライバシーを保護します。
検証者が 検証可能なクレデンシャルの ステータスを確認する必要がある場合、推奨されるフローは以下のとおりです:
このエンドポイントは、提示に含めるステータスリスト・クレデンシャルを取得する必要がある 保持者や、プライバシーの観点から 発行者への直接連絡が許容される場合にも役立つ可能性があります。
GET /status-lists/{id} - ステータスリスト・クレデンシャルを取得します
/status-lists/{id} エンドポイントは、GET を受信する際に以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | ステータスリスト・クレデンシャルが正常に取得されました content-type: application/json
以下の形式のオブジェクト:
|
| 404 | ステータスリストが見つかりません |
このエンドポイントは、ステータスリスト内で発行済みの 検証可能なクレデンシャル のステータスを更新するために使用されます。クレデンシャルのステータスを変更する必要がある場合 (例: 失効または一時停止)、このエンドポイントはステータスリスト・クレデンシャル内の 対応するエントリーを更新します。
要求は通常、更新するクレデンシャル、ステータスリスト・エントリー情報 (ステータスリスト・クレデンシャル識別子およびそのリスト内のインデックスを含む)、 および新しいステータス値を指定します。ステータス・サービスは、それに応じて ステータスリスト・クレデンシャルを更新します。
POST /credentials/status - 発行済みクレデンシャルのステータスを更新します
/credentials/status エンドポイントは、POST を受信する際に以下のスキーマを使用します:
| プロパティ | 説明 |
|---|---|
credentialId [string] |
クレデンシャルを識別します(識別子は VC 自体に現れる必要はありません)。 |
credentialStatus [object] |
更新する特定のステータスリスト・エントリーを識別します。これは以下の形式のオブジェクトでなければ
なりません(MUST):
|
status [boolean] |
新しいステータスを指定します。 |
indexAllocator [string] |
サービスが、どのインデックスが VC に使用/割り当てられているかを使用するためのもの。 |
/credentials/status エンドポイントは、POST を受信する際に以下のいずれかの応答となる可能性があります:
| 応答 | 本文 |
|---|---|
| 200 | クレデンシャルのステータスが正常に更新されました |
| 400 | Bad Request |
| 404 | クレデンシャルが見つかりません |
以下は、単一のステップを含む最小ワークフローと見なされ得るもののテンプレート例であり、 続いて最小クレデンシャルの例を示します。これらの「最小」テンプレートはいずれも、 各例で行われる認可と変数の選択に依然として依存している点に注意してください。
{
"id": "https://localhost:18443/workflows/z19nXMUSyXawSMK6j65Vs4jb1",
"sequence": 0,
"controller": "did:key:z6Mko4QbcRSTBUFiPMU1PfrNM1KWK8qoSef263DfngFohXgZ",
"steps": {
"verify": {
"stepTemplate": {
"type": "jsonata",
"template": "{\"verifiablePresentationRequest\": verifiablePresentationRequest}"
}
}
},
"initialStep": "verify",
"zcaps": {...}
}
{
"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": {...}
}
以下は、より複雑なワークフローの例です。
この最初の例は複数のステップを持ち、検証と発行を含み、ZCAP と OAuth2 の両方の
認可をサポートし、カスタム変数あり/なしの両方でクレデンシャル・テンプレートの
再利用を示し、提示スキーマのチェックを含みます。
この例は Verifiable Credentials Data Model 2.0(validFrom、
https://www.w3.org/ns/credentials/v2)を使用します。
{
"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 を含みます。
{
"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"
}
}
}
}
検証可能なクレデンシャル のライフサイクルには、 ワークフローの作成、交換に参加するための初期インタラクション、発行、 ステータス管理、ローカル・クレデンシャル管理、提示、検証、および妥当性確認が含まれます。この 仕様は、検証可能なクレデンシャル のライフサイクル 管理のための HTTP ベース API を定義し、これは 発行者、保持者、および 検証者によって使用できます。 Digital Credential API、OpenID for Verifiable Credential Issuance v1.0、および OpenID for Verifiable Presentations v1.0 など、この仕様と似た機能を提供するように見える 仕様は他にもあります。この節では、この仕様の標準化の前に 検討された他の仕様と、この仕様がエコシステム内の他の仕様とどのように 異なるかを説明します。
根本的に、この仕様は 検証可能なクレデンシャルの ライフサイクル管理全体に焦点を当てた唯一の仕様です。これは、 クレデンシャル形式、クレデンシャル・クエリ言語、およびクレデンシャル配信プロトコルに依存しません。 検証可能なクレデンシャルまたは エンベロープされた 検証可能なクレデンシャルとして表現可能な任意の クレデンシャル形式を、この仕様で使用できます。同様に、 OpenID for Verifiable Credential Issuance v1.0 や OpenID for Verifiable Presentations v1.0 などのクレデンシャル配信プロトコルは、 この仕様で定義されるインタラクションおよび交換で使用できます。 最後に、この仕様は、技術の改善や市場分野の専門化に伴う柔軟性を提供するために、 複数のクレデンシャル・クエリ言語をサポートします。
この仕様は、検証可能なクレデンシャル ライフサイクル管理の全体に対する API を定義します。そうしなければ、ベンダー ロックインの機会が生じるためです。検証可能なクレデンシャル のライフサイクル管理全体を通じてベンダー・ロックを防ぐインターフェイスを提供する 他の仕様は存在しません。
この節は、この仕様が W3C Proposed Recommendation になった際に、 レビュー、承認、および IANA への登録のために Internet Engineering Steering Group (IESG) に 提出されます。
作業部会は、この仕様への貢献について以下の個人に感謝します: 謝辞の最終リストは、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.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: