#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. Неважно, понял! В других местах были проблемы, которые я допустил при попытке отладки. Спасибо!