Integra Gestore delle credenziali con Accedi con Google

Riquadro inferiore abilitato di Gestore delle credenziali che mostra le varie identità tra cui scegliere.
Figura 1. L'aspetto della finestra di dialogo nel riquadro inferiore di Accedi con Google dopo l'integrazione con l'API Credential Manager.

Questo documento spiega come eseguire la migrazione della finestra di dialogo Accedi con Google nel riquadro inferiore dai Servizi di identità Google (GIS) all'API Credentials Manager utilizzando la libreria helper Google ID.

Un'app che utilizza l'API Credential Manager è configurata per presentare all'utente finale un'interfaccia utente Android coerente che consente all'utente di scegliere da un elenco di opzioni di accesso salvate, inclusi gli account abilitati per passkey. Questa è l'API Android consigliata per consolidare diversi tipi di credenziali e provider. A partire da Android 14, gli utenti possono anche utilizzare gestori delle password di terze parti con l'API Credential Manager.

Dichiara le dipendenze

Nel file build.gradle del modulo, dichiara le dipendenze utilizzando la versione più recente:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Segui le istruzioni per configurare il tuo progetto della console API di Google. Sostituisci le indicazioni sull'inclusione delle dipendenze con le istruzioni riportate sopra.

Creare l'istanza di una richiesta di accesso a Google

Per iniziare l'implementazione, crea un'istanza di una richiesta di accesso a Google. Utilizza GetGoogleIdOption per recuperare il token ID Google di un utente.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Devi prima chiamare l'API con il parametro setFilterByAuthorizedAccounts impostato su true. Se non ci sono credenziali disponibili, chiama di nuovo l'API e imposta setFilterByAuthorizedAccounts su false.

Se vuoi far accedere automaticamente gli utenti quando possibile, abilita la funzionalità con setAutoSelectEnabled nella richiesta GetGoogleIdOption. L'accesso automatico è possibile quando vengono soddisfatti i seguenti criteri:

  • L'utente ha esattamente una credenziale salvata per la tua app, ovvero una password salvata o un Account Google salvato.
  • L'utente non ha disattivato l'accesso automatico nelle impostazioni dell'Account Google.

Per migliorare la sicurezza dell'accesso ed evitare attacchi di ripetizione, usa setNonce per includere un nonce in ogni richiesta. Scopri di più sulla generazione di un nonce.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>);
  .build();

Accedi con Google

Ecco i passaggi per configurare un flusso Accedi con Google:

  1. Crea un'istanza di GetCredentialRequest e aggiungi googleIdOption creata in precedenza per recuperare le credenziali.
  2. Passa questa richiesta alla chiamata getCredential() (Kotlin) o getCredentialAsync() (Java) per recuperare le credenziali disponibili dell'utente.
  3. Una volta che l'API ha esito positivo, estrai il campo CustomCredential che contiene il risultato dei dati di GoogleIdTokenCredential.
  4. Il tipo di CustomCredential deve essere uguale al valore di GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Converti l'oggetto in un elemento GoogleIdTokenCredential utilizzando il metodo GoogleIdTokenCredential.createFrom.
  5. Se la conversione ha esito positivo, estrai l'ID di GoogleIdTokenCredential, convalidalo e autentica la credenziale sul tuo server.
  6. Se la conversione non va a buon fine con un token GoogleIdTokenParsingException, potresti dover aggiornare la versione della libreria Accedi con Google.
  7. Individuare i tipi di credenziali personalizzate non riconosciuti.

Kotlin

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Java

GetCredentialRequest request = new GetCredentialRequest.Builder()
  .addGetCredentialOption(googleIdOption)
  .build();

// Launch sign in flow and do getCredential Request to retrieve the credentials
credentialManager.getCredentialAsync(
  requireActivity(),
  request,
  cancellationSignal,
  <executor>,
  new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
    @Override
    public void onResult(GetCredentialResponse result) {
      handleSignIn(result);
    }

    @Override
    public void onError(GetCredentialException e) {
      handleFailure(e);
    }
  }
);

public void handleSignIn(GetCredentialResponse result) {
  // Handle the successfully returned credential.
  Credential credential = result.getCredential();

  if (credential instanceof PublicKeyCredential) {
    String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
    // Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
  } else if (credential instanceof PasswordCredential) {
    String username = ((PasswordCredential) credential).getId();
    String password = ((PasswordCredential) credential).getPassword();
    // Use id and password to send to your server to validate and authenticate
  } else if (credential instanceof CustomCredential) {
    if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
      try {
        // Use googleIdTokenCredential and extract id to validate and
        // authenticate on your server
        GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
      } catch (GoogleIdTokenParsingException e) {
        Log.e(TAG, "Received an invalid Google ID token response", e);
      }
    } else {
      // Catch any unrecognized custom credential type here.
      Log.e(TAG, "Unexpected type of credential");
    }
  } else {
    // Catch any unrecognized credential type here.
    Log.e(TAG, "Unexpected type of credential");
  }
}

Pulsante Accedi con Google

Il pulsante Accedi con Google è supportato da Credential Manager con la più recente libreria helper ID Google. Per attivare il flusso del pulsante Accedi con Google, utilizza GetSignInWithGoogleOption anziché GetGoogleIdOption e gestisci l'elemento GoogleIdTokenCredential restituito come prima.

Registrati con Google

Se non viene restituito alcun risultato dopo aver impostato setFilterByAuthorizedAccounts su true durante l'istanza della richiesta GetGoogleIdOption e la sua trasmissione a GetCredentialsRequest, significa che non ci sono account autorizzati per accedere. A questo punto, devi configurare setFilterByAuthorizedAccounts(false) e chiamare Registrati con Google.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Dopo aver creato un'istanza della richiesta di registrazione a Google , avvia il flusso di autenticazione in modo simile a quanto indicato nella sezione Accedi con Google.

Gestire l'uscita

Quando un utente esce dalla tua app, chiama il metodo API clearCredentialState() per cancellare lo stato attuale delle credenziali dell'utente e reimpostare lo stato interno dell'accesso.