Przyznawanie dostępu do danych użytkownika na Androidzie

Uwierzytelnianie pozwala ustalić, kim jest użytkownik, i jest zwykle nazywane rejestracją lub logowaniem użytkowników. Autoryzacja to proces przyznawania i odrzucania dostępu do danych lub zasobów. Na przykład aplikacja prosi o zgodę użytkownika na dostęp do jego Dysku Google.

Wywołania uwierzytelniania i autoryzacji powinny odbywać się w 2 odrębnych procesach, zależnie od potrzeb witryny lub aplikacji.

Jeśli aplikacja ma funkcje, które mogą korzystać z danych interfejsu API Google, ale nie są wymagane w ramach jej głównych funkcji, zaprojektuj ją tak, aby działała płynnie w przypadkach, gdy dane interfejsu API nie są dostępne. Jeśli użytkownik nie przyzna dostępu do Dysku, możesz na przykład ukryć listę ostatnio zapisanych plików.

O dostęp do zakresów potrzebnych do uzyskania dostępu do interfejsów API Google należy prosić tylko wtedy, gdy użytkownik wykona działanie wymagające dostępu do określonego interfejsu API. Możesz na przykład prosić użytkownika o dostęp do jego Dysku za każdym razem, gdy kliknie przycisk „Zapisz na Dysku”.

Oddzielając autoryzację od uwierzytelniania, możesz uniknąć przytłoczenia nowych użytkowników i dezorientowania użytkowników, którzy nie będą wiedzieć, dlaczego są proszeni o określone uprawnienia.

W usługach tożsamości Google uwierzytelnianie odbywa się przy użyciu SignInClient. Do autoryzowania działań, które wymagają dostępu do danych użytkownika przechowywanych przez Google, zalecamy użycie narzędzia AuthorizationClient.

Wysyłanie prośby o uprawnienia wymagane przez działania użytkownika

Za każdym razem, gdy użytkownik wykona działanie, które wymaga dodatkowego zakresu, wywołaj funkcję AuthorizationClient.authorize().

Jeśli na przykład użytkownik wykona działanie, które wymaga dostępu do miejsca w aplikacji Dysk, wykonaj te czynności:

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

W wywołaniu zwrotnym onActivityResult możesz sprawdzić, czy wymagane uprawnienia zostały uzyskane, a jeśli tak, wykonaj działanie użytkownika.

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