Autorizzare l'accesso ai dati utente di Google

L'autenticazione stabilisce chi è una persona ed è comunemente indicata come registrazione o accesso dell'utente. L'autorizzazione è il processo di concessione o rifiuto dell'accesso a dati o risorse. Ad esempio, la tua app richiede il consenso dell'utente per accedere a Google Drive.

Le chiamate di autenticazione e autorizzazione devono essere due flussi distinti e separati in base alle esigenze dell'app.

Se la tua app include funzionalità che possono utilizzare i dati dell'API Google, ma non sono obbligatorie come parte delle funzionalità di base dell'app, devi progettarla in modo che possa gestire in modo elegante i casi in cui i dati dell'API non sono accessibili. Ad esempio, potresti nascondere un elenco di file salvati di recente se l'utente non ha concesso l'accesso a Drive.

Devi richiedere l'accesso agli ambiti di cui hai bisogno per accedere alle API di Google solo quando l'utente esegue un'azione che richiede l'accesso a una determinata API. Ad esempio, devi richiedere l'autorizzazione per accedere a Drive dell'utente ogni volta che l'utente tocca un pulsante "Salva in Drive".

Separando l'autorizzazione dall'autenticazione, puoi evitare di sopraffare i nuovi utenti o di confonderli sul motivo per cui gli vengono richieste determinate autorizzazioni.

Per l'autenticazione, ti consigliamo di utilizzare l'API Credential Manager. Per autorizzare azioni che richiedono l'accesso ai dati utente archiviati da Google, consigliamo di utilizzare AuthorizationClient.

Richiedi le autorizzazioni richieste dalle azioni dell'utente

Ogni volta che un utente esegue un'azione che richiede un ambito aggiuntivo, chiama AuthorizationClient.authorize().

Ad esempio, se un utente esegue un'azione che richiede l'accesso allo spazio di archiviazione dell'app Drive, procedi nel seguente modo:

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
        .authorize(authorizationRequest)
        .addOnSuccessListener(
            authorizationResult -> {
              if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                try {
startIntentSenderForResult(pendingIntent.getIntentSender(),
REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                } catch (IntentSender.SendIntentException e) {
                Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                }
              } else {
            // Access already granted, continue with user action
                saveToDriveAppFolder(authorizationResult);
              }
            })
        .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

Nel callback onActivityResult dell'attività, puoi verificare se le autorizzazioni richieste sono state acquisite correttamente e, in caso affermativo, eseguire l'azione dell'utente.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
    AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
    saveToDriveAppFolder(authorizationResult);
  }
}