无法在App脚本中授权Google Data Transfer API 重要提示:参考:

问题描述

我有一个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/drivehttps://www.googleapis.com/auth/calendar
6。点击授权

重要提示:

  • 确保服务帐户模拟了具有适当管理员权限的用户(.setSubject(email)),以实际传输数据。

参考: