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

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

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

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

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

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

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

Настройте свой проект

  1. Откройте свой проект в или создайте проект, если у вас его еще нет.
  2. На , убедитесь, что вся информация является полной и точной.
    1. Убедитесь, что вашему приложению назначены правильное имя, логотип и домашняя страница приложения. Эти значения будут представлены пользователям на экране согласия «Вход с помощью Google» при регистрации и на экране «Сторонние приложения и службы» .
    2. Убедитесь, что вы указали URL-адреса политики конфиденциальности и условий обслуживания вашего приложения.
  3. В , создайте идентификатор клиента Android для своего приложения, если у вас его еще нет. Вам нужно будет указать имя пакета вашего приложения и подпись SHA-1.
    1. Перейти к .
    2. Нажмите Создать клиента .
    3. Выберите тип приложения Android .
  4. В , создайте новый идентификатор клиента «Веб-приложение», если вы еще этого не сделали. На данный момент вы можете игнорировать поля «Авторизованные источники JavaScript» и «Авторизованные URI перенаправления». Этот идентификатор клиента будет использоваться для идентификации вашего внутреннего сервера, когда он взаимодействует со службами аутентификации Google.
    1. Перейти к .
    2. Нажмите Создать клиента .
    3. Выберите тип веб-приложения .

Объявить зависимости

В файле build.gradle вашего модуля объявите зависимости, используя последнюю версию библиотеки Google Identity Services.

dependencies {
  // ... other dependencies

  implementation "com.google.android.gms:play-services-auth:<latest version>"
}

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

Всякий раз, когда пользователь выполняет действие, требующее дополнительной области действия, вызывайте 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);
  }
}

Если вы получаете доступ к API Google на стороне сервера, вы можете вызвать метод getServerAuthCode() класса AuthorizationResult, чтобы получить код аутентификации, который вы отправляете на свой сервер для обмена на токен доступа и обновления.