Не удается авторизовать API передачи данных Google в скрипте приложения

#google-apps-script #google-admin-sdk

#google-apps-script #google-admin-sdk

Вопрос:

У меня есть приложение Appscript, которое использует библиотеку OAuth2 от Google для выполнения различных функций в домене G suite. Я хотел добавить возможность передачи пользовательских данных с помощью API передачи, но у меня возникли проблемы с авторизацией сервиса. У меня нет проблем с авторизацией API-интерфейсов gmail, drive и directory, и я убедился, что служба включена в проекте GCP. Однако я не могу авторизовать свою службу OAuth2, я каждый раз получаю зарегистрированное сообщение о том, что моя учетная запись службы не авторизована. Чего здесь не хватает?

Вот мой код:

 const migrationScope = ['https://www.googleapis.com/auth/admin.datatransfer'];

function migrateUser(sourceUser, targetUser, type) {
  var url = 'https://www.googleapis.com/admin/datatransfer/v1/transfers';
  var service = getService_('superadmin_account@company.com', 'admin', migrationScope);
  var transferObject = {
    oldOwnerUSerId: getUserId(sourceUser), // this takes an email and returns the user ID which is required by the API
    newOwnerUserId: getUserId(targetUser),
    applicationDataTransfers: [
      {
        applicationTransferParams: [
          {
            value: type,
          }
        ],
        applicationId: 5********6 // Our App ID for Drive
      }
    ]
  }
  if (service.hasAccess()) {
    var response = UrlFetchApp.fetch(url, requestBuilder(service, transferObject, 'POST'));
    try {
      var result = JSON.parse(response.getContentText());
      return (result);
    }
    catch (e) {
      return (undefined);
    }
  } else { Logger.log("Service does not have access to migrate content."); }
}

function getService_(email, service, scopes) {
  return OAuth2.createService(service   ':'   email)
    .setTokenUrl('https://oauth2.googleapis.com/token').
    .setPrivateKey(PRIVATE_KEY)
    .setIssuer(CLIENT_EMAIL)
    .setSubject(email)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setScope(scopes);
}
function requestBuilder(service, payload, method) {
  return {
    method: method,
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer '   service.getAccessToken()
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };
}
  

Ответ №1:

Сам код, похоже, в порядке, предполагая, что requestBuilder возвращает правильно отформатированные расширенные параметры для вызова UrlFetch.

Учитывая тип ошибки, которую вы получаете, я думаю, что вы не добавили область https://www.googleapis.com/auth/admin.datatransfer действия на панели делегирования домена в консоли администратора.

При использовании учетной записи службы для олицетворения других пользователей вам необходимо добавить в эту панель любую область, доступ к которой должна иметь учетная запись службы. Недостаточно, чтобы API был включен в проекте GCP или чтобы область действия была добавлена на экран согласия. Вам также нужно добавить их туда.

Для этого выполните следующие действия, как указано здесь:

Затем суперадминистратор домена G Suite должен выполнить следующие действия:

1. В консоли администратора домена G Suite перейдите в Главное меню> Безопасность> Элементы управления API.
2. На панели делегирования домена выберите Управление делегированием домена.
3. Нажмите Добавить новый.
4. В поле Идентификатор клиента введите идентификатор клиента учетной записи службы. Идентификатор клиента вашей учетной записи службы можно найти на странице учетных записей служб.
5. В поле Области OAuth (через запятую) введите список областей, к которым вашему приложению должен быть предоставлен доступ. Например, если вашему приложению требуется полный доступ к API Google Диска и API Календаря Google на уровне домена, введите: https://www.googleapis.com/auth/drive , https://www.googleapis.com/auth/calendar .
6. Нажмите Авторизовать.

Важное замечание:

  • Убедитесь, что учетная запись службы выдает себя за пользователя ( .setSubject(email) ), который имеет соответствующие права администратора для фактической передачи данных.

Ссылка:

Комментарии:

1. Спасибо, я совершенно забыл обновить эту страницу, поэтому я добавил область и немного подождал, но, похоже, я все еще получаю ошибку. Я попытался настроить setSubject пользователя как на учетную запись superadmin, так и на учетную запись с настройками диска и ролью администратора передачи данных, но я получаю ту же ошибку. Я также добавил к вопросу свою функцию построения запросов.

2. Неважно, понял! В других местах были проблемы, которые я допустил при попытке отладки. Спасибо!