首页 > 解决方案 > 无法在应用脚本中授权 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
  };
}

标签: google-apps-scriptgoogle-admin-sdk

解决方案


代码本身似乎没问题,假设为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)具有适当管理员权限以实际传输数据的用户 ( )。

参考:


推荐阅读