L'accesso con account collegato consente 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 reinserire nome utente e password. Inoltre, si riduce la 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 abilitata.
In questo documento scoprirai come modificare la tua app per Android per supportare l'accesso con account collegato.
Come funziona
- Attiva la visualizzazione degli account collegati durante il flusso di accesso One Tap.
- Se l'utente ha eseguito l'accesso a Google e ha collegato il suo Account Google al suo account sul tuo servizio, verrà restituito un token ID per l'account collegato.
- All'utente viene mostrata una richiesta di accesso One Tap con un'opzione per accedere al tuo servizio con il suo account collegato.
- 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.
Configurazione
Configurazione dell'ambiente di sviluppo
Scarica la versione più recente di Google Play Services sull'host di sviluppo:
- Apri l' SDK Android Manager.
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 "Collega con Google" al file gradle a livello di app del modulo, che in genere è
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Modificare 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 consentire l'accesso all'utente.
Il seguente esempio di codice descrive in dettaglio i passaggi per recuperare, verificare il token ID e, successivamente, consentire l'accesso all'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); });
Verificare l'integrità del token ID
Utilizzare una libreria client API di Google
L'utilizzo della libreria client 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, l'attestazione aud, l'attestazione iss e l'attestazione exp.
Se devi verificare che il token ID rappresenti un account dell'organizzazione Google Workspace o Cloud, puoi verificare l'attestazione hd controllando il nome di dominio restituito dal metodo Payload.getHostedDomain().