Разрешить доступ к данным пользователя на Android

Аутентификация устанавливает, кто кто, и обычно называется регистрацией пользователя или входом в систему. Авторизация — это процесс предоставления или отказа в доступе к данным или ресурсам. Например, ваше приложение запрашивает согласие вашего пользователя на доступ к Google Диску пользователя.

Вызовы аутентификации и авторизации должны представлять собой два отдельных потока в зависимости от потребностей сайта или приложения.

Если в вашем приложении есть функции, которые могут использовать данные API Google, но не являются обязательными как часть основных функций вашего приложения, вам следует спроектировать свое приложение так, чтобы оно могло корректно обрабатывать случаи, когда данные API недоступны. Например, вы можете скрыть список недавно сохраненных файлов, если пользователь не предоставил доступ к Диску.

Вам следует запрашивать доступ к областям, которые необходимы для доступа к API Google, только тогда, когда пользователь выполняет действие, требующее доступа к определенному API. Например, вам следует запрашивать разрешение на доступ к Диску пользователя каждый раз, когда он нажимает кнопку «Сохранить на Диск».

Отделив авторизацию от аутентификации, вы можете избежать перегрузки новых пользователей и не вводить их в заблуждение относительно того, почему у них запрашиваются определенные разрешения.

В службах идентификации Google аутентификация осуществляется с помощью SignInClient . Для авторизации действий, требующих доступа к пользовательским данным, хранящимся в Google, мы рекомендуем использовать AuthorizationClient .

Запрос разрешений, необходимых для действий пользователя

Всякий раз, когда пользователь выполняет действие, требующее дополнительной области действия, вызывайте AuthorizationClient.authorize() .

Например, если пользователь выполняет действие, требующее доступа к хранилищу приложений на Диске, выполните следующие действия:

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

В обратном вызове onActivityResult вашей активности вы можете проверить, были ли необходимые разрешения успешно получены, и если да, выполнить действие пользователя.

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