Implementare il ripristino delle credenziali con Credential Manager

Questa pagina descrive come creare, accedere e eliminare una chiave di ripristino.

Compatibilità delle versioni

La funzionalità Ripristina credenziali del Gestore delle credenziali funziona sui dispositivi con Android 9 e versioni successive, Google Play Services (GMS) core versione 24220000 o successive e la versione 1.5.0 o successive della libreria androidx.credentials.

Prerequisiti

Configura un server della relying party simile al server per le passkey. Se hai già configurato un server per gestire l'autenticazione con le passkey, utilizza la stessa implementazione lato server per le chiavi di ripristino.

Dipendenze

Aggiungi le seguenti dipendenze al file build.gradle del modulo dell'app:

Kotlin

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

Trendy

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

La funzionalità Ripristina credenziali è disponibile dalla versione 1.5.0 e successive della libreria androidx.credentials. Tuttavia, ti consigliamo di utilizzare le versioni stabili più recenti delle dipendenze, se possibile.

Panoramica

  1. Crea una chiave di ripristino: per creare una chiave di ripristino, completa i seguenti passaggi:
    1. Crea un'istanza del Gestore delle credenziali: crea un CredentialManager oggetto.
    2. Ottieni le opzioni di creazione delle credenziali dal server dell'app: invia all' app client i dettagli necessari per creare la chiave di ripristino dal tuo server dell'app.
    3. Crea la chiave di ripristino: crea una chiave di ripristino per l'account dell'utente se l'utente ha eseguito l'accesso alla tua app.
    4. Gestisci la risposta alla creazione delle credenziali: invia le credenziali dall'app client al server dell'app per l'elaborazione e gestisci eventuali eccezioni.
  2. Accedi con una chiave di ripristino: per accedere con una chiave di ripristino, completa i seguenti passaggi:
    1. Ottieni le opzioni di recupero delle credenziali dal server dell'app: invia all'app client i dettagli necessari per recuperare la chiave di ripristino dal tuo server dell'app.
    2. Ottieni la chiave di ripristino: richiedi la chiave di ripristino al Gestore delle credenziali quando l'utente configura un nuovo dispositivo. In questo modo, l'utente può accedere senza inserire ulteriori dati.
    3. Gestisci la risposta al recupero delle credenziali: invia la chiave di ripristino dall'app client al server dell'app per consentire all'utente di accedere.
  3. Elimina una chiave di ripristino.

Crea una chiave di ripristino

Crea la chiave di ripristino dopo che l'utente ha eseguito l'autenticazione nella tua app, subito dopo l'accesso o durante un avvio successivo dell'app se l'utente ha già eseguito l'accesso.

Crea un'istanza del Gestore delle credenziali

Utilizza il contesto dell'attività dell'app per creare un'istanza di un oggetto CredentialManager.

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

Ottieni le opzioni di creazione delle credenziali dal server dell'app

Utilizza una libreria conforme a FIDO nel server dell'app per inviare all'app client le informazioni necessarie per creare la credenziale di ripristino, ad esempio informazioni sull'utente, sull'app e proprietà di configurazione aggiuntive. Per ulteriori informazioni sull'implementazione lato server, consulta la guida lato server.

Crea la chiave di ripristino

Dopo aver analizzato le opzioni di creazione della chiave pubblica inviate dal server, crea una chiave di ripristino racchiudendo queste opzioni in un CreateRestoreCredentialRequest oggetto e chiamando il createCredential() metodo con l'oggetto CredentialManager.

// createRestoreRequest contains the details sent by the server 
val response = credentialManager.createCredential(context, createRestoreRequest)

Punti chiave sul codice

  • L'oggetto CreateRestoreCredentialRequest contiene i seguenti campi:

    • requestJson: le opzioni di creazione delle credenziali inviate dal server dell'app nel formato dell'API Web Authentication per PublicKeyCredentialCreationOptionsJSON.
    • isCloudBackupEnabled: campo Boolean per determinare se la chiave di ripristino deve essere sottoposta a backup sul cloud. Per impostazione predefinita, questo flag è true. Questo campo ha i seguenti valori:

      • true: (consigliato) questo valore consente di eseguire il backup delle chiavi di ripristino sul cloud se l'utente ha attivato il backup di Google e la crittografia end-to-end, ad esempio un blocco schermo.
      • false: questo valore salva la chiave localmente e non sul cloud. La chiave non è disponibile sul nuovo dispositivo se l'utente sceglie di eseguire il ripristino dal cloud.

Gestisci la risposta alla creazione delle credenziali

L'API Credential Manager restituisce una risposta di tipo CreateRestoreCredentialResponse. Questa risposta contiene la risposta alla registrazione delle credenziali della chiave pubblica in formato JSON.

Invia la chiave pubblica dalla tua app al server della relying party. Questa chiave pubblica è simile alla chiave pubblica generata quando crei una passkey. Lo stesso codice che gestisce la creazione della passkey sul server può gestire anche la creazione della chiave di ripristino. Per ulteriori informazioni sull'implementazione lato server, consulta la guida per le passkey.

Durante la procedura di creazione della chiave di ripristino, gestisci queste eccezioni:

  • CreateRestoreCredentialDomException: questa eccezione si verifica se requestJson non è valido e non segue il formato WebAuthn per PublicKeyCredentialCreationOptionsJSON.
  • E2eeUnavailableException: questa eccezione si verifica se isCloudBackupEnabled è true, ma il dispositivo dell'utente non dispone del backup dei dati o della crittografia end-to-end, ad esempio un blocco schermo.
  • IllegalArgumentException: questa eccezione si verifica se createRestoreRequest è vuoto o non è un JSON valido oppure se non ha un user.id valido che conforme alle specifiche WebAuthn.

Accedi con una chiave di ripristino

Utilizza la funzionalità Ripristina credenziali per consentire all'utente di accedere automaticamente durante la procedura di configurazione del dispositivo.

Ottieni le opzioni di recupero delle credenziali dal server dell'app

Invia all'app client le opzioni necessarie per ottenere la chiave di ripristino dal server. Per una guida simile alle passkey per questo passaggio, consulta Accedere con una passkey. Per ulteriori informazioni sull'implementazione lato server, consulta la guida all'autenticazione lato server.

Ottieni la chiave di ripristino

Per ottenere la chiave di ripristino sul nuovo dispositivo, chiama il metodo getCredential() sull'oggetto CredentialManager.

Puoi recuperare la chiave di ripristino nei seguenti scenari:

  • (Consigliato) subito dopo il ripristino dei dati dell'app. Utilizza BackupAgent per configurare il backup dell'app e completa la getCredential funzionalità all'interno del onRestore callback per assicurarti che le credenziali dell'app vengano ripristinate immediatamente dopo il ripristino dei dati dell'app. In questo modo si evitano potenziali ritardi quando gli utenti aprono il nuovo dispositivo per la prima volta e gli utenti possono interagire senza dover attendere l'apertura dell'app.
  • Al primo avvio dell'app sul dispositivo.

Per inviare notifiche a un utente prima che apra l'app per la prima volta su un nuovo dispositivo, recupera la chiave di ripristino all'interno del callback onRestore di BackupAgent. Ciò è particolarmente pertinente per le app di messaggistica o comunicazione.

// Fetch the options required to get the restore key
val authenticationJson = fetchAuthenticationJson()

// Create the GetRestoreCredentialRequest object
val options = GetRestoreCredentialOption(authenticationJson)
val getRequest = GetCredentialRequest(listOf(options))

val response = credentialManager.getCredential(context, getRequest)

Le API del Gestore delle credenziali restituiscono una risposta di tipo GetCredentialResponse. Questa risposta contiene la chiave pubblica.

Gestisci la risposta di accesso

Invia la chiave pubblica dall'app al server della relying party, che può essere utilizzata per consentire all'utente di accedere. Lato server, questa azione è simile all'accesso con una passkey. Lo stesso codice che gestisce l'accesso con le passkey sul server può gestire anche gli accessi con le chiavi di ripristino. Per ulteriori informazioni su ll'implementazione lato server per le passkey, consulta Accedere con una passkey.

Elimina la chiave di ripristino

Il Gestore delle credenziali è senza stato e non è a conoscenza dell'attività dell'utente, pertanto non elimina automaticamente le chiavi di ripristino dopo l'uso. Per eliminare una chiave di ripristino, chiama il metodo clearCredentialState(). Per motivi di sicurezza, elimina la chiave ogni volta che un utente esce. In questo modo, la volta successiva che l'utente apre l'app sullo stesso dispositivo, l'utente esce e gli viene chiesto di accedere di nuovo.

La disinstallazione di un'app viene interpretata come un intento di eliminare la chiave di ripristino corrispondente dal dispositivo, in modo simile all'intento dell'utente quando esce.

Le chiavi di ripristino vengono rimosse solo nelle seguenti situazioni:

  • Azioni a livello di sistema: gli utenti disinstallano l'app o cancellano i relativi dati.
  • Chiamate a livello di app: elimina la chiave a livello di programmazione chiamando clearCredentialState() quando gestisci l'uscita dell'utente nel codice dell'app.

Quando l'utente esce dalla tua app, chiama il metodo clearCredentialState() sull'oggetto CredentialManager.

// Create a ClearCredentialStateRequest object
val clearRequest = ClearCredentialStateRequest(TYPE_CLEAR_RESTORE_CREDENTIAL)

// When the user logs out, delete the restore key
val response = credentialManager.clearCredentialState(clearRequest)