Zugriff auf Google-Nutzerdaten autorisieren

Bei der Authentifizierung wird festgestellt, wer jemand ist. Sie wird häufig als Nutzerregistrierung oder Anmeldung bezeichnet. Die Autorisierung dient dazu, den Zugriff auf Daten oder Ressourcen zu gewähren oder abzulehnen. Ihre App fordert beispielsweise die Einwilligung des Nutzers zum Zugriff auf sein Google Drive an.

Authentifizierungs- und Autorisierungsaufrufe sollten zwei separate und eindeutige Abläufe sein, die auf den Anforderungen der App basieren.

Wenn Ihre App Funktionen hat, die Google API-Daten nutzen können, aber nicht zu den Hauptfunktionen Ihrer App gehören, sollten Sie Ihre App so gestalten, dass sie auch dann ordnungsgemäß funktioniert, wenn keine API-Daten verfügbar sind. So können Sie beispielsweise eine Liste der zuletzt gespeicherten Dateien ausblenden, wenn der Nutzer keinen Drive-Zugriff gewährt hat.

Sie sollten nur dann Zugriff auf Bereiche anfordern, die Sie für den Zugriff auf Google APIs benötigen, wenn der Nutzer eine Aktion ausführt, für die der Zugriff auf eine bestimmte API erforderlich ist. Sie sollten beispielsweise immer dann die Berechtigung zum Zugriff auf das Drive-Konto des Nutzers anfordern, wenn er auf die Schaltfläche „In Drive speichern“ tippt.

Wenn Sie Autorisierung und Authentifizierung trennen, können Sie verhindern, dass neue Nutzer überfordert werden oder verwirrt sind, warum sie nach bestimmten Berechtigungen gefragt werden.

Für die Authentifizierung empfehlen wir die Credential Manager API. Für die Autorisierung von Aktionen, für die Zugriff auf von Google gespeicherte Nutzerdaten erforderlich ist, empfehlen wir die Verwendung von AuthorizationClient.

Berechtigungen anfordern, die für Nutzeraktionen erforderlich sind

Wenn ein Nutzer eine Aktion ausführt, die zusätzliche Berechtigungen erfordert, rufe AuthorizationClient.authorize() an.

Wenn ein Nutzer beispielsweise eine Aktion ausführt, für die Zugriff auf den Speicherplatz seiner Drive App erforderlich ist, gehen Sie so vor:

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));

Im onActivityResult-Callback deiner Aktivität kannst du prüfen, ob die erforderlichen Berechtigungen erfolgreich abgerufen wurden. Falls ja, kannst du die Nutzeraktion ausführen.

@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);
  }
}