Accesso all'account collegato per Android

L'accesso con account collegato abilita l'accesso One Tap con Google per gli utenti che hanno già collegato il proprio Account Google al tuo servizio. In questo modo, l'esperienza degli utenti migliora perché possono accedere con un solo clic, senza dover inserire di nuovo nome utente e password. Inoltre, riduce le probabilità che gli utenti creino account duplicati sul tuo servizio.

L'accesso con account collegato è disponibile nell'ambito del flusso di accesso con un solo tocco per Android. Ciò significa che non devi importare una libreria separata se la funzionalità One Tap è già attiva nella tua app.

In questo documento scoprirai come modificare la tua app per Android in modo da supportare l'accesso con l'account collegato.

Come funziona

  1. Attiva la visualizzazione degli account collegati durante il flusso di accesso con un solo tocco.
  2. Se l'utente ha eseguito l'accesso a Google e ha collegato il proprio Account Google al suo account sul tuo servizio, verrà restituito un token ID per l'account collegato.
  3. All'utente viene mostrata una richiesta di accesso One Tap con la possibilità di accedere al tuo servizio con il proprio account collegato.
  4. Se l'utente sceglie di continuare con l'account collegato, il token ID dell'utente viene restituito alla tua app. Confrontalo con il token inviato al tuo server nel passaggio 2 per identificare l'utente che ha eseguito l'accesso.

Configura

Configura l'ambiente di sviluppo

Installa la versione più recente di Google Play Services sull'host di sviluppo:

  1. Apri Android SDK Manager.
  1. In Strumenti SDK, individua Google Play Services.

  2. Se lo stato di questi pacchetti non è Installato, selezionali entrambi e fai clic su Installa pacchetti.

Configurare l'app

  1. Nel file build.gradle a livello di progetto, includi il repository Maven di Google sia nelle sezioni buildscript che allprojects.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. Aggiungi le dipendenze per l'API"Collega con Google" al file Gradle a livello di app del tuo modulo, che in genere è app/build.gradle:

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.3.0'
    }
    

Modificare l'app per Android in modo che supporti l'accesso con l'account collegato

Al termine del flusso di accesso con account collegato, alla tua app viene restituito un token ID. L'integrità del token ID deve essere verificata prima dell'accesso dell'utente.

Il seguente esempio di codice descrive i passaggi per recuperare, verificare il token ID e successivamente far accedere l'utente.

  1. Crea un'attività per ricevere il risultato dell'intent di accesso

    Kotlin

      private val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
          try {
            val signInCredentials = Identity.signInClient(this)
                                    .signInCredentialFromIntent(result.data)
            // Review the Verify the integrity of the ID token section for
            // details on how to verify the ID token
            verifyIdToken(signInCredential.googleIdToken)
          } catch (e: ApiException) {
            Log.e(TAG, "Sign-in failed with error code:", e)
          }
        } else {
          Log.e(TAG, "Sign-in failed")
        }
      }
    

    Java

      private final ActivityResultLauncher<IntentSenderResult>
        activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
        If (result.getResultCode() == RESULT_OK) {
            try {
              SignInCredential signInCredential = Identity.getSignInClient(this)
                             .getSignInCredentialFromIntent(result.getData());
              verifyIdToken(signInCredential.getGoogleIdToken());
            } catch (e: ApiException ) {
              Log.e(TAG, "Sign-in failed with error:", e)
            }
        } else {
            Log.e(TAG, "Sign-in failed")
        }
    });
    
  2. Crea la richiesta di accesso

    Kotlin

    private val tokenRequestOptions =
    GoogleIdTokenRequestOptions.Builder()
      .supported(true)
      // Your server's client ID, not your Android client ID.
      .serverClientId(getString("your-server-client-id")
      .filterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                               scopes)
      .build()
    

    Java

     private final GoogleIdTokenRequestOptions tokenRequestOptions =
         GoogleIdTokenRequestOptions.Builder()
      .setSupported(true)
      .setServerClientId("your-service-client-id")
      .setFilterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                                scopes)
      .build()
    
  3. Avvia l'intent Accesso in attesa

    Kotlin

     Identity.signInClient(this)
        .beginSignIn(
      BeginSignInRequest.Builder()
        .googleIdTokenRequestOptions(tokenRequestOptions)
      .build())
        .addOnSuccessListener{result ->
          activityResultLauncher.launch(result.pendingIntent.intentSender)
      }
      .addOnFailureListener {e ->
        Log.e(TAG, "Sign-in failed because:", e)
      }
    

    Java

     Identity.getSignInClient(this)
      .beginSignIn(
        BeginSignInRequest.Builder()
          .setGoogleIdTokenRequestOptions(tokenRequestOptions)
          .build())
      .addOnSuccessListener(result -> {
        activityResultLauncher.launch(
            result.getPendingIntent().getIntentSender());
    })
    .addOnFailureListener(e -> {
      Log.e(TAG, "Sign-in failed because:", e);
    });
    

Verificare l'integrità del token ID

Utilizzare una libreria client dell'API di Google

L'utilizzo della libreria client dell'API Google per Java è il modo consigliato per convalidare gli ID token di Google in un ambiente di produzione.

Java

  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

  ...

  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
      // Specify the CLIENT_ID of the app that accesses the backend:
      .setAudience(Collections.singletonList(CLIENT_ID))
      // Or, if multiple clients access the backend:
      //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
      .build();

  // (Receive idTokenString by HTTPS POST)

  GoogleIdToken idToken = verifier.verify(idTokenString);
  if (idToken != null) {
    Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // Use or store profile information
    // ...

  } else {
    System.out.println("Invalid ID token.");
  }

Il metodo GoogleIdTokenVerifier.verify() verifica la firma JWT, l'attributo aud, l'attributo iss e l'attributo exp.

Se devi convalidare che il token di identità rappresenti un account dell'organizzazione Google Workspace o Cloud, puoi verificare l'affermazione hd controllando il nome di dominio restituito dal metodo Payload.getHostedDomain().