L'accesso con account collegato attiva 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, in quanto possono accedere con un solo clic, senza dover inserire nuovamente il nome utente e la 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 One Tap per Android. Ciò significa che non devi importare una libreria separata se la tua app ha già la funzionalità One Tap attivata.
In questo documento imparerai a modificare la tua app per Android per supportare l'accesso con account collegato.
Come funziona
- Attivi l'opzione per mostrare gli account collegati durante il flusso di accesso One Tap.
- Se l'utente ha eseguito l'accesso su Google e ha collegato il proprio Account Google al proprio account sul tuo servizio, verrà restituito un token ID per l'account collegato.
- All'utente viene mostrata una richiesta di accesso One Tap con l'opzione per accedere al tuo servizio con il proprio account collegato.
- Se l'utente sceglie di continuare con l'account collegato, il suo token ID 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.
Configurazione
Per configurare l'accesso con account collegato, configura l'ambiente di sviluppo e l'app.
Configurazione dell'ambiente di sviluppo
Scarica la versione più recente di Google Play Services sul tuo host di sviluppo:
- Apri SDK Manager Android.
In Strumenti SDK, trova Google Play Services.
Se lo stato di questi pacchetti non è Installato, selezionali entrambi e fai clic su Installa pacchetti.
Configura la tua app
Nel file
build.gradlea livello di progetto, includi il repository Maven di Google nelle sezionibuildscripteallprojects.buildscript { repositories { google() } } allprojects { repositories { google() } }Aggiungi le dipendenze per l'API"Link with Google" al file gradle a livello di app del modulo, che di solito è
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Modifica l'app per Android per supportare l'accesso con 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 di far accedere l'utente.
Il seguente esempio di codice descrive i passaggi per recuperare, verificare il token ID e, successivamente, far accedere l'utente.
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") } });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()Avvia il pending intent di accesso
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); });
Verifica l'integrità del token ID
Utilizza una libreria client delle API di Google
L'utilizzo della libreria client delle API di Google per Java è il modo consigliato per convalidare i token ID 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, la rivendicazione aud, la rivendicazione iss e la rivendicazione exp.
Se devi convalidare che il token ID rappresenti un account di un'organizzazione Google Workspace o Cloud, puoi verificare l'attestazione hd controllando il nome di dominio restituito dal metodo Payload.getHostedDomain().