Mantieni le credenziali coerenti con i fornitori di credenziali

Quando un utente crea una passkey, il server della relying party salva alcuni dettagli, mentre il fornitore di credenziali, ad esempio Gestore delle password di Google, ne salva altri. Nello specifico:

  • Il server della relying party salva la credenziale della chiave pubblica.
  • Il fornitore di credenziali salva il nome utente, il nome visualizzato, la chiave privata e altri metadati associati. Questi metadati aiutano gli utenti a identificare e selezionare la passkey richiesta durante l'accesso.

Le potenziali incoerenze tra i dati salvati sul server della relying party e il fornitore di credenziali possono portare a esperienze utente negative. Possono sorgere problemi nei seguenti scenari:

  • Una credenziale viene eliminata sul server della relying party, ma non sul provider di credenziali, che di conseguenza mostra all'utente la credenziale eliminata.
  • Un nome utente o un nome visualizzato viene aggiornato sul server della relying party, ma non sul fornitore di credenziali, che mostra i dettagli obsoleti.

L'API Signal di Credential Manager consente alle relying party di comunicare con i provider di credenziali per eliminare le credenziali e aggiornare i metadati utente, ad esempio il nome utente e il nome visualizzato. Esistono tre tipi di richieste supportati per diversi scenari:

  • SignalUnknownCredentialRequest

    • Indica che una credenziale specifica non è più valida e deve essere nascosta o rimossa dal fornitore di credenziali.
  • SignalAllAcceptedCredentialIdsRequest

    • Fornisce un elenco di ID credenziali accettati al fornitore di credenziali.
  • SignalCurrentUserDetailsRequest

    • Aggiorna i dettagli dei metadati dell'utente.

Compatibilità delle versioni

L'API Signal è disponibile sui dispositivi con Android 15 o versioni successive e a partire dalla versione 1.6.0-beta03 della libreria androidx.credentials.

Implementazione

Per utilizzare l'API Signal, segui questi passaggi:

  1. Aggiungi la dipendenza Credential Manager al tuo progetto.

    Kotlin

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

    Trendy

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

  2. Chiama l'API Signal

    Per inviare una richiesta di indicatore al fornitore di credenziali, utilizza una richiesta di indicatore supportata. Ciascuno dei tipi di richiesta di indicatori richiede una richiesta JSON, come mostrato negli esempi seguenti:

    • Credenziale sconosciuta (SignalUnknownCredentialRequest)

      Utilizza SignalUnknownCredentialRequest per indicare che una credenziale è rifiutata e considerata sconosciuta. Quando il fornitore di credenziali riceve questo segnale, nasconde o elimina la credenziale.

      Utilizzo

      Utilizza questo indicatore quando la relying party non riesce a verificare un'asserzione passkey. Ciò implica che la passkey non è valida e deve essere nascosta o rimossa dal fornitore di credenziali.

      I parametri JSON richiesti per questa richiesta sono rpId e credentialId. Per saperne di più sulla struttura JSON, consulta Opzioni 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()
          )
      )
      
    • Tutte le credenziali accettate (SignalAllAcceptedCredentialIdsRequest)

      Utilizza SignalAllAcceptedCredentialIdsRequest per comunicare ai fornitori di credenziali l'insieme di tutte le credenziali accettate. Una volta ricevuto l'indicatore dal fornitore di credenziali, quest'ultimo nasconde o elimina le credenziali non incluse in questo elenco oppure mostra le credenziali precedentemente nascoste che ora sono incluse nell'elenco.

      Utilizzo

      Utilizza questo indicatore quando la verifica della passkey non va a buon fine da parte della relying party. Questo errore indica che la passkey non è valida e deve essere nascosta o rimossa dal fornitore di credenziali. Puoi utilizzare questo segnale ogni volta che devi trasmettere l'insieme di ID credenziali noti ai fornitori di credenziali.

      I parametri JSON richiesti per questa richiesta sono rpId, userId e allAcceptedCredentialIds. Per saperne di più sulla struttura JSON, consulta Opzioni di 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()
          )
      )
      
    • Dettagli utente attuali (SignalCurrentUserDetailsRequest)

      Utilizza SignalCurrentUserDetailsRequest per comunicare ai fornitori di credenziali che i metadati, come il nome utente e il nome visualizzato per un determinato utente, sono stati aggiornati e devono essere visualizzati nel fornitore di credenziali.

      Utilizzo

      Utilizza questo segnale quando l'utente o la relying party aggiorna i metadati della passkey associati all'account utente.

      I parametri JSON richiesti per questa richiesta sono rpId, userId, name e displayName. Per ulteriori informazioni sulla struttura JSON, consulta Opzioni di 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()
          )
      )
      

Testare l'implementazione

Per testare l'implementazione dell'API Signal, completa i seguenti passaggi:

  1. Installa l'esempio di provider di credenziali denominato MyVault.

  2. Attiva MyVault come fornitore di credenziali in Impostazioni > Password, passkey e account > Servizio preferito.

    Il menu Servizio preferito nelle impostazioni di Android, che mostra MyVault abilitato come fornitore di credenziali.

  3. Attiva tutte le notifiche per MyVault in Impostazioni > App > MyVault > Notifiche.

    Il menu Notifiche dell&#39;app MyVault, che mostra tutte le notifiche attivate.

  4. Verifica che l'opzione Pop-up sullo schermo sia attiva per le notifiche in Impostazioni > App > MyVault > Notifiche > Categorie > Canale di notifica API Signal.

    Impostazioni del canale di notifica dell&#39;API Signal per MyVault, che mostra l&#39;opzione &quot;Visualizza sullo schermo&quot; attivata.

  5. Nella tua app, attiva i flussi che inviano le richieste di indicatori al fornitore di credenziali. Dovresti vedere le notifiche di MyVault sullo schermo. In questo modo viene verificato che il fornitore di credenziali abbia ricevuto le richieste.