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

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

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

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

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

認証情報マネージャーの Signal API を使用すると、証明書利用者(RP)は認証情報プロバイダと通信して、認証情報の削除や、ユーザー メタデータ(ユーザー名や表示名など)の更新を行うことができます。さまざまなシナリオに対応する 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-alpha02")
    }

    Groovy

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

  2. Signal API を呼び出す

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

    • 不明な認証情報(SignalUnknownCredentialRequest)

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

      使用方法

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

      このリクエストに必要な JSON パラメータは rpId と credentialId です。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 パラメータは、rpId、userId、allAcceptedCredentialIds です。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 パラメータは、rpId、userId、name、displayName です。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 からの通知が表示されます。 これにより、認証情報プロバイダがリクエストを受信したことを確認できます。