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:
- Crea un'istanza di
GetCredentialRequest
e aggiungigoogleIdOption
creata in precedenza per recuperare le credenziali. - Passa questa richiesta alla chiamata
getCredential()
(Kotlin) ogetCredentialAsync()
(Java) per recuperare le credenziali disponibili dell'utente. - Una volta che l'API ha esito positivo, estrai il campo
CustomCredential
che contiene il risultato dei dati diGoogleIdTokenCredential
. - Il tipo di
CustomCredential
deve essere uguale al valore diGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
. Converti l'oggetto in un elementoGoogleIdTokenCredential
utilizzando il metodoGoogleIdTokenCredential.createFrom
. - Se la conversione ha esito positivo, estrai l'ID di
GoogleIdTokenCredential
, convalidalo e autentica la credenziale sul tuo server. - Se la conversione non va a buon fine con un token
GoogleIdTokenParsingException
, potresti dover aggiornare la versione della libreria Accedi con Google. - 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.