Digital Credentials API: ウェブ上の安全でプライベートな ID

公開日: 2025 年 10 月 3 日

このたび、Chrome 141 以降で Digital Credentials API がデフォルトで有効になりました。また、iOS 26 では、Chrome などのブラウザで Digital Credentials API のサポートが追加されています。この API は、ウェブ上の身元確認に新たなレベルのセキュリティとプライバシーをもたらし、ウェブサイトがユーザーから検証可能な情報をリクエストして受け取るための標準化された方法を可能にします。

オリジン トライアルが成功したため、Digital Credentials API は Android での同一デバイスの認証情報の提示と、デスクトップ版 Chrome でのクロスデバイスの提示の両方をサポートするようになりました。

背景

オンラインでの本人確認はこれまで複雑なプロセスであり、多くの場合、ユーザーは身分証明書のスキャンをアップロードする必要がありました。この方法では、必要以上のデータを共有することが多く、ユーザーのプライバシーに関する重大な懸念が生じます。デベロッパーにとっても、ソリューションが安全かつプライバシーを保護する方法で、多くの場合均一でない機密データを処理して保存できることを保証する必要があるため、リスクが生じます。

同時に、eIDAS 2.0 などの規制により、政府は国民にデジタル ID の手段を提供することが義務付けられています。これらのデジタル ID ウォレットは、身分証明書や年齢証明書など、さまざまな認証情報を保持できる必要があります。オンライン サービス プロバイダは、ユーザーの身元を確認するためにこれらの認証情報をリクエストできます。

W3C のウェブ標準コミュニティは、プライバシーに対するユーザーの要求とユーザーデータの検証に対するデベロッパーのニーズの両方を満たすデジタル認証情報の可能性を認識し、デジタル認証情報 API というソリューションを開発しました。Digital Credentials API は、ユーザー情報を検証するための組み込みインターフェースを導入することで、この問題に対処することを目的としています。これにより、代替手段と比較して、セキュリティ、プライバシー、ユーザー エクスペリエンスが向上します。この API を使用すると、ユーザーは ID スキャンなどの機密性の高いドキュメントを複数のウェブサイトにアップロードする必要がなくなります。ウェブサイトは、信頼できる発行者から必要な特定の暗号署名付きデータのみをリクエストすることで、ユーザーとの信頼関係を構築できます。

基本機能

Digital Credentials API は、プライバシー、クロス プラットフォームのサポート、標準化という 3 つの基本原則に基づいて構築されています。

プライバシー

Digital Credentials API は、オンラインでのプライバシーとセキュリティを強化します。これにより、ユーザーはモバイルウォレットのデジタル ID をウェブサイトに提示して、基盤となる機密データを公開することなく特定の事実を確認できます。たとえば、API はユーザーの生年月日全体を開示することなく、ユーザーが 18 歳以上であることを確認できます。この「選択的開示」の原則により、ウェブサイトは必要な最小限の情報のみを受け取ることができます。

Digital Credentials API は、Google の Longfellow ZK などのゼロ知識証明(ZKP)プロトコルとも互換性があります。これにより、特定の ID アサーションが真であることを示す暗号証明を他の情報を開示することなく返すことで、ユーザーのプライバシーが保護されます。

クロス プラットフォームのサポート

Digital Credentials API は、さまざまなプラットフォームをサポートすることを目的としています。これにより、ユーザーはデバイス間で検証済みの情報を簡単に提示できます。

Android の場合: 組み込みのユーザー インターフェースを提供し、ユーザーがインストール済みのウォレット アプリから認証情報を選択できるようにします。

パソコンの場合: パソコンのブラウザで、モバイルウォレットの認証情報をウェブサイトに提示できます。QR コードをスキャンすると、システムはデスクトップとモバイル デバイスの間に安全なエンドツーエンドの暗号化されたフィッシング対策接続を確立します。この接続では、CTAP プロトコルを使用して BLE 経由でユーザーの近接性を確認し、ユーザーが両方のデバイスを物理的に操作していることを確認します。

標準化

相互運用性が重要です。Chrome では、Digital Credentials API はプロトコル プラットフォームに依存せず、OpenID4VPISO 18013-7 の Annex C など、さまざまなプレゼンテーション プロトコルと互換性があります。また、Apple は Safari 26.0 から Digital Credentials API のサポートを導入しています。

また、Digital Credentials API は、Android の組み込みの認証情報管理サポートと、互換性のあるウォレットのエコシステムの拡大を基盤としています。Google ウォレットは早期導入者であり、Samsung Wallet と 1Password のサポートも予定されています。

オリジン トライアルからの変更点

以前のオリジン トライアルに参加された方は、Digital Credentials API が navigator.identity.get() から navigator.credentials.get() に移動したことに気づかれるでしょう。これは、Credential Management API を使用したより広範な ID 統合の取り組みに沿ったものです。また、providers パラメータの名前が requests に変更され、request の名前が data になりました。

実装

Digital Credentials API の統合には、機能の検出と認証情報の要求という 2 つの主な手順があります。また、デベロッパーは、アプリケーションが認証情報を使用できるかどうかを判断するカスタム ロジックを実装する必要があります。

特徴検出

[デジタル認証情報で確認] ボタンを表示する前に、ユーザーのブラウザで Digital Credentials API が利用可能かどうかを確認します。

if (typeof DigitalCredential !== "undefined") {
  // Digital Credentials API is supported
} else {
  // Digital Credentials API is not supported
}

認証情報をリクエストする

認証情報の取得には、digital パラメータを指定した navigator.credentials.get() の呼び出しが必要です。デジタル認証情報タイプ内に、次の基本パラメータを含む DigitalCredentialGetRequest を含む requests 配列を追加します。

  • protocol: 文字列で交換プロトコルを指定します。たとえば、"openid4vp""org-iso-mdoc" です。次のようにして、ブラウザでプロトコルがサポートされているかどうかを検出します。

    if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
        // Create a request with this protocol
      } else {
        // Protocol is not supported
    }
    
  • data: 指定されたプロトコルでデジタル ウォレット アプリが受け入れるパラメータを含むオブジェクト"openid4vp" のパラメータは、W3C Digital Credentials API 仕様の OpenID for Verifiable Presentation(OID4VP)で定義されています。

    try {
      const digitalCredential = await navigator.credentials.get({
        digital: {
          requests: [{
            protocol: "openid4vp-v1-unsigned",
            data: {
              response_type: "vp_token",
          nonce: "[some-nonce]",
              client_metadata: {...},
          dcql_query: {...}
            }
        }]
        }
      });
    
      // Decrypt payload respons and verify credentials on the backend
      const response = await fetch("/verify", {
        method: "POST",
          body: JSON.stringify(digitalCredential.data),
          headers: {
              'Content-Type': 'application/json'
          }
      });
    } catch (e) {
      // Handle errors, such as the user canceling the request
      console.error(e);
    }
    

たとえば、ユーザーの姓、名、およびユーザーが 21 歳以上かどうかを示すブール値をリクエストするには、次のペイロードを指定します。

{
  protocol: 'openid4vp-v1-unsigned',
  data: {
    response_type: 'vp_token',
    nonce: '[some-nonce]',
    // Contains the Verifier metadata values, including supported credential formats and response encryption public key
    client_metadata: {
  // Supported credential formats. Refer to the documentation for specific values
        vp_formats_supported: {...},
   // Public key(s). Refer to the documentation for more detail.
        jwks: {...}
    },
    dcql_query: {
      // A wallet will try to find credentials it holds that match these definitions.
      credentials: [
        {
          // A locally unique identifier for this credential definition within the query.
          id: "cred_vc",
          format: "dc+sd-jwt",
          meta: {
            // 'vct_values' specifies the Verifiable Credential allowed type.
            // In this case, it's a European Digital Identity (EUDI) Personal Identification Data (PID) credential.
            vct_values: [
              "urn:eudi:pid:1"
            ]
          },
          // 'claims' is an array of specific data that's being requested.
          claims: [
            {
              // The path ["age_equal_or_over", "18"] corresponds to accessing `credential.age_equal_or_over['18']`.
              path: [
                "age_equal_or_over",
                "18"
              ]
            }
          ]
        }
      ]
    }
  }
}

この例では、client_metadata でサポートされている形式のリストを指定する必要があります。使用できる値については、仕様をご覧ください。client_metadata で設定されたオプションの jwksには、レスポンスの暗号化に使用される公開鍵が含まれている必要があります。デモコードで、その他の例を確認することもできます。

以下に、DigitalCredential オブジェクトの暗号化されたレスポンス ペイロードの例を示します。

{
    // This is an example for a response using an OpenID4VP protocol.
    // The format of the 'data' object will differ for other protocols.
    "protocol": "openid4vp-v1-unsigned",
    "data": {
        // To decrypt this JWE payload, use the private key.
   // The decrypted payload will be a JSON object containing the
       // Verifiable Presentation in the 'vp_token' claim.
        "response": "[jwe-token]"
    }
}

この例では、システムは openid4vp-v1-unsigned プロトコルで認証情報をリクエストし、レスポンスの data プロパティに response が含まれています。

レスポンスの正確な解析方法は、プロトコルによって異なります。通常、次の操作を行う必要があります。

  1. レスポンス ペイロードを復号します。復号方法は、使用するプロトコルによって異なります。openid4vp(JWE を使用)と org-iso-mdoc(ハイブリッド公開鍵暗号化を使用)のペイロードを復号する方法をご覧ください。
  2. 署名と発行者を確認します。詳しくは、デジタル認証情報のオンラインでの受け入れに関するドキュメントをご覧ください。

さまざまなプロトコルのコードサンプルについては、デモのコードまたはホストされているライブ バージョンをご覧ください。

発行元の信頼性を確認する

デジタル認証情報の暗号署名は、認証情報が本物であることを証明します。ただし、デベロッパーは、発行者が特定のユースケースに適しており、信頼できることを確認する必要があります。たとえば、大学生割引を適用する場合、e コマース サイトでは認定大学が発行した認証情報を必要とし、他のエンティティが署名した認証情報は拒否します。発行元に対する信頼性を検証する一般的な方法は、承認済みの発行元のリストを保持し、一致しない発行元を拒否することです。

始める

構築を開始するには、次の説明をご覧ください。

  • 利用可能状況: Chrome 141 以降では、さまざまなプラットフォームでデフォルトで Digital Credentials API が有効になっています。
  • 前提条件: ユーザーは、Google Play 開発者サービス バージョン 24.0 以降を搭載した Android デバイス、バージョン 26 以降を搭載した iOS デバイスなど、互換性のあるデバイスが必要です。デバイスには、Digital Credentials API をサポートするデジタル ウォレット アプリケーション(Google ウォレットやデモウォレットなど)がインストールされている必要があります。
  • デモを試す: ユーザー エクスペリエンスを理解し、実装をテストする最善の方法は、Chrome 141 以降で https://verifier.multipaz.org のライブデモを試すことです。

リソース

詳細については、以下のリソースをご確認ください。

フィードバックをお寄せください

デジタル認証情報 API がリリースされましたので、この API を使用した開発についてご意見をお聞かせください。問題を報告して、フィードバックを送信したり、バグを報告したりします。