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