google-apps-script - 无法在应用脚本中授权 Google 数据传输 API
问题描述
我有一个 Appscript 应用程序,它使用Google 的 OAuth2 库在 G Suite 域上执行各种功能。我想添加使用Transfer API传输用户数据的功能,但我在授权服务时遇到了问题。我对 gmail、驱动器和目录 API 的授权没有任何问题,并且我确保该服务在 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
};
}
解决方案
代码本身似乎没问题,假设为UrlFetch调用requestBuilder
返回格式正确的高级参数。
考虑到您遇到的错误类型,我认为您没有在管理控制台https://www.googleapis.com/auth/admin.datatransfer
的域范围委派窗格中添加范围。
使用服务帐户模拟其他用户时,您需要在此窗格中添加服务帐户应该能够访问的任何范围。在 GCP 项目上启用 API 或将范围添加到同意屏幕是不够的。你也需要在那里添加它们。
为此,请按照此处指定的以下步骤操作:
然后,G Suite 域的超级管理员必须完成以下步骤:
1. 在 G Suite 域的管理控制台中,转到主菜单 > 安全 > API 控制。
2. 在域范围委派窗格中,选择管理域范围委派。
3. 点击新增。
4. 在客户 ID字段中,输入服务帐户的客户 ID。您可以在服务帐户页面中找到您的服务帐户的客户端 ID 。
5. 在OAuth 范围内(逗号分隔)字段,输入应授予您的应用程序访问权限的范围列表。例如,如果您的应用程序需要对 Google Drive API 和 Google Calendar API 的域范围的完全访问权限,请输入:https://www.googleapis.com/auth/drive
,https://www.googleapis.com/auth/calendar
。
6. 点击授权。
重要的提示:
- 确保服务帐户模拟
.setSubject(email)
具有适当管理员权限以实际传输数据的用户 ( )。