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

ユーザーがパスキーを作成すると、証明書利用者サーバーが一部の 詳細を保存し、認証情報プロバイダ(Google パスワード マネージャーなど)がその他の 詳細を保存します。詳細は以下のとおりです。

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

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

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

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

  • SignalUnknownCredentialRequest

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

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

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

バージョンの互換性

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

実装

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

  1. プロジェクトに認証情報マネージャーの依存関係を追加します。

    Kotlin

    dependencies {
        implementation("androidx.credentials:credentials:1.7.0-alpha01")
    }

    Groovy

    dependencies {
        implementation "androidx.credentials:credentials:1.7.0-alpha01"
    }

  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 を使用して、受け入れられたすべての認証情報のセットを認証情報プロバイダに通知します。認証情報プロバイダがシグナルを受信すると、このリストに含まれていない認証情報は非表示または削除されます。また、以前に非表示にされた認証情報がリストに含まれるようになった場合は、その認証情報の非表示が解除されます。

      SignalUnknownCredentialRequest

      使用方法

      証明書利用者によるパスキーの検証が失敗した場合は、このシグナルを使用します。 この失敗は、パスキーが無効であり、認証情報プロバイダによって非表示または削除される必要があることを意味します。既知の認証情報 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 からの通知が表示されます。これにより、認証情報プロバイダがリクエストを受信したことが確認されます。