認証情報プロバイダと認証情報の整合性を維持する

ユーザーがパスキーを作成すると、リライング パーティ サーバーが特定の詳細を保存し、Google パスワード マネージャーなどの認証情報プロバイダがその他の詳細を保存します。詳細は以下のとおりです。

  • 証明書利用者のサーバーが公開鍵認証情報を保存します。
  • 認証情報プロバイダは、ユーザー名、表示名、秘密鍵、その他の関連するメタデータを保存します。このメタデータは、ログイン時に必要なパスキーをユーザーが特定して選択するのに役立ちます。

証明書利用者サーバーと証明書プロバイダに保存されたデータ間に不整合が生じると、ユーザー エクスペリエンスの低下につながる可能性があります。次のようなシナリオで問題が発生する可能性があります。

  • 認証情報は、証明書利用者サーバーでは削除されたが、証明書プロバイダでは削除されなかったため、証明書プロバイダが削除された認証情報をユーザーに表示する。
  • ユーザー名または表示名が証明書利用者サーバーで更新されたが、認証情報プロバイダでは更新されなかったため、認証情報プロバイダに古い詳細が表示される。

Credential Manager の Signal API を使用すると、証明書利用者と証明書プロバイダが通信して、証明書の削除や、ユーザー名や表示名などのユーザー メタデータの更新を行うことができます。さまざまなシナリオに対応するため、次の 3 つのリクエスト タイプがサポートされています。

  • SignalUnknownCredentialRequest

    • 特定の認証情報が無効になり、認証情報プロバイダから非表示にするか削除する必要があることを示します。
  • SignalAllAcceptedCredentialIdsRequest

    • 認証情報プロバイダに、受け入れ可能な認証情報 ID のリストを提供します。
  • SignalCurrentUserDetailsRequest

    • ユーザーのメタデータの詳細を更新します。

バージョンの互換性

Signal API は、Android 15 以降を搭載したデバイスで利用できます。androidx.credentials ライブラリのバージョン 1.6.0-beta03 以降で利用できます。

実装

Signal API を使用する手順は次のとおりです。

  1. プロジェクトに Credential Manager の依存関係を追加します。

    Kotlin

    dependencies {
        implementation("androidx.credentials:credentials:1.6.0-rc01")
    }

    Groovy

    dependencies {
        implementation "androidx.credentials:credentials:1.6.0-rc01"
    }

  2. Signal API を呼び出す

    認証情報プロバイダにシグナル リクエストを送信するには、サポートされているシグナル リクエストを使用します。次の例に示すように、各シグナル リクエスト タイプには JSON リクエストが必要です。

    • 不明な認証情報SignalUnknownCredentialRequest

      SignalUnknownCredentialRequest を使用して、認証情報が拒否され、不明と見なされることを通知します。認証情報プロバイダがこのシグナルを受け取ると、認証情報を非表示にするか削除します。

      使用目的

      このシグナルは、証明書利用者によるパスキー アサーションの検証が失敗した場合に使用します。これは、パスキーが無効であり、認証情報プロバイダによって非表示にするか削除する必要があることを意味します。

      このリクエストに必要な JSON パラメータは rpIdcredentialId です。JSON 構造の詳細については、signalUnknownCredential オプションをご覧ください。

      credentialManager.signalCredentialState(
          SignalUnknownCredentialRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("credentialId", credentialId /* [String] Credential ID of the credential to be hidden or deleted */)
              }.toString()
          )
      )
      
    • すべての承認済み認証情報SignalAllAcceptedCredentialIdsRequest

      SignalAllAcceptedCredentialIdsRequest を使用して、受け入れられたすべての認証情報のセットで認証情報プロバイダに通知します。認証情報プロバイダがシグナルを受信すると、このリストに含まれていない認証情報が非表示または削除され、リストに含まれるようになった以前に非表示にされた認証情報が再表示されます。

      使用目的

      パスキーの検証が証明書利用者によって失敗した場合に、このシグナルを使用します。この失敗は、パスキーが無効であることを意味します。認証情報プロバイダは、パスキーを非表示にするか、削除する必要があります。このシグナルは、既知の認証情報 ID のセットを認証情報プロバイダにブロードキャストする必要がある場合にも使用できます。

      このリクエストに必要な JSON パラメータは、rpIduserIdallAcceptedCredentialIds です。JSON 構造の詳細については、signalAllAcceptedCredential オプションをご覧ください。

      credentialManager.signalCredentialState(
          SignalAllAcceptedCredentialIdsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put(
                      "allAcceptedCredentialIds",
                      JSONArray(credentialIdsList /* [List<String>] List of accepted Credential IDs */)
                  )
              }.toString()
          )
      )
      
    • 現在のユーザーの詳細SignalCurrentUserDetailsRequest

      SignalCurrentUserDetailsRequest を使用して、特定のユーザーのユーザー名や表示名などのメタデータが更新され、認証情報プロバイダに表示される必要があることを認証情報プロバイダに通知します。

      使用目的

      このシグナルは、ユーザーまたは証明書利用者がユーザー アカウントに関連付けられたパスキー メタデータを更新するときに使用します。

      このリクエストに必要な JSON パラメータは、rpIduserIdnamedisplayName です。JSON 構造の詳細については、signalCurrentUserDetails オプションをご覧ください。

      credentialManager.signalCredentialState(
          SignalCurrentUserDetailsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put("name", name /* [String] New Name to be updated for the current user */)
                  put("displayName", displayName /* [String] New display name to be updated for the current user */)
              }.toString()
          )
      )
      

実装をテストする

Signal API の実装をテストする手順は次のとおりです。

  1. MyVault という名前の認証情報プロバイダのサンプルをインストールします。

  2. [設定] > [パスワード、パスキー、アカウント] > [優先サービス] で、MyVault を認証情報プロバイダとして有効にします。

    Android 設定の [優先サービス] メニュー。認証情報プロバイダとして MyVault が有効になっていることが示されています。

  3. [設定] > [アプリ] > [MyVault] > [通知] で、MyVault のすべての通知を有効にします。

    MyVault アプリの [通知] メニュー。すべての通知が有効になっていることが示されている。

  4. [設定] > [アプリ] > [MyVault] > [通知] > [カテゴリ] > [Signal API 通知チャンネル] で、通知の [画面にポップアップ] がオンになっていることを確認します。

    MyVault の Signal API 通知チャンネルの設定。[画面にポップアップ表示] オプションが有効になっている。

  5. アプリで、認証情報プロバイダにシグナル リクエストを送信するフローをトリガーします。画面に MyVault からの通知が表示されます。これにより、認証情報プロバイダがリクエストを受信したことが確認されます。