Consenti agli utenti di accedere automaticamente alla tua app utilizzando l'API Credentials per richiedere e recuperare le credenziali archiviate per gli utenti.
Prima di iniziare
Configura un progetto Android Studio.
Crea un oggetto CredentialsClient
Per richiedere le credenziali archiviate, devi creare un'istanza di
CredentialsClient
per accedere all'API Credentials:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
Crea un oggetto CredentialRequest
Un oggetto CredentialRequest
specifica
sistemi di accesso da cui vuoi richiedere le credenziali. Crea un
CredentialRequest
utilizzando il metodo setPasswordLoginSupported
per
l'accesso basato su password e il metodo setAccountTypes()
per gli account
di accesso a servizi come Accedi con Google.
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
Utilizza le costanti definite in IdentityProviders
per specificare i provider di accesso di uso comune. Per gli altri provider di accesso, utilizza qualsiasi
che identifica in modo univoco il provider. Devi utilizzare lo stesso identificatore del provider
per archiviare le credenziali mentre le utilizzi.
Richiedi credenziali archiviate
Dopo aver creato gli oggetti CredentialsClient
e CredentialRequest
, passa l'oggetto di richiesta
alle CredentialsClient.request()
per richiedere le credenziali archiviate per la tua app.
mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
new OnCompleteListener<CredentialRequestResponse>() {
@Override
public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
if (task.isSuccessful()) {
// See "Handle successful credential requests"
onCredentialRetrieved(task.getResult().getCredential());
return;
}
// See "Handle unsuccessful and incomplete credential requests"
// ...
}
});
Definisci un callback per gestire le richieste riuscite e non riuscite utilizzando il metodo
addOnCompleteListener()
.
Gestire le richieste di credenziali riuscite
In una richiesta di credenziali andata a buon fine, utilizza
Credential
per completare l'accesso dell'utente alla tua app. Utilizza il metodo getAccountType()
per determinare il tipo di credenziali recuperate, quindi completa le credenziali di accesso
e il processo di sviluppo. Ad esempio, per Accedi con Google, crea un oggetto GoogleSignInClient
che
include l'ID utente, quindi utilizza l'oggetto per avviare il flusso di accesso. Per password
accedi, utilizza l'ID utente e la password dell'oggetto Credential per completare la
procedura di accesso.
private void onCredentialRetrieved(Credential credential) {
String accountType = credential.getAccountType();
if (accountType == null) {
// Sign the user in with information from the Credential.
signInWithPassword(credential.getId(), credential.getPassword());
} else if (accountType.equals(IdentityProviders.GOOGLE)) {
// The user has previously signed in with Google Sign-In. Silently
// sign in the user with the same ID.
// See https://developers.google.com/identity/sign-in/android/
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
Task<GoogleSignInAccount> task = signInClient.silentSignIn();
// ...
}
}
Gestire più credenziali salvate
Quando è necessario l'input dell'utente per selezionare una credenziale, l'attività request()
con un errore ResolvableApiException
. Verifica che
getStatusCode()
restituisce RESOLUTION_REQUIRED
e
chiama il metodo startResolutionForResult()
dell'eccezione per chiedere all'utente
per scegliere un account. Quindi, recupera le credenziali scelte dall'utente dal
il metodo onActivityResult()
dell'attività passando Credential.EXTRA_KEY
al
getParcelableExtra()
:
.
mCredentialsClient.request(request).addOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { // ... return; } Exception e = task.getException(); if (e instanceof ResolvableApiException) { // This is most likely the case where the user has multiple saved // credentials and needs to pick one. This requires showing UI to // resolve the read request. ResolvableApiException rae = (ResolvableApiException) e; resolveResult(rae, RC_READ); } else if (e instanceof ApiException) { // The user must create an account or sign in manually. Log.e(TAG, "Unsuccessful credential request.", e); ApiException ae = (ApiException) e; int code = ae.getStatusCode(); // ... } } });
private void resolveResult(ResolvableApiException rae, int requestCode) {
try {
rae.startResolutionForResult(MainActivity.this, requestCode);
mIsResolving = true;
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Failed to send resolution.", e);
hideProgress();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// ...
if (requestCode == RC_READ) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
onCredentialRetrieved(credential);
} else {
Log.e(TAG, "Credential Read: NOT OK");
Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
}
}
// ...
}
Se non vengono trovate le credenziali memorizzate, gli utenti devono creare un account oppure eseguire
accedi. Se getStatusCode()
restituisce SIGN_IN_REQUIRED
,
puoi anche velocizzare le procedure di registrazione e accesso richiedendo il
all'utente di scegliere le informazioni di accesso utilizzate di recente, come indirizzo email e
e compilando automaticamente alcuni campi dei moduli con quelle informazioni.
Vedi Fornire suggerimenti di accesso a un utente.
per maggiori dettagli.
All'accesso riuscito, consenti agli utenti di salvare le proprie credenziali per automatizzare le autenticazioni future su tutti i loro dispositivi.