【问题标题】:Cannot authorize Google Data Transfer API in App Script无法在应用脚本中授权 Google 数据传输 API
【发布时间】:2020-10-01 14:54:26
【问题描述】:

我有一个 Appscript 应用程序,它使用 Google's OAuth2 library 在 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-script google-admin-sdk


    【解决方案1】:

    代码本身似乎没问题,假设requestBuilderUrlFetch 调用返回格式正确的高级参数。

    考虑到您遇到的错误类型,我认为您没有在管理控制台的域范围授权窗格中添加范围 https://www.googleapis.com/auth/admin.datatransfer

    使用服务帐户模拟其他用户时,您需要在此窗格中添加服务帐户应该能够访问的任何范围。在 GCP 项目上启用 API 或将范围添加到同意屏幕是不够的。您也需要在此处添加它们。

    为此,请按照here 指定的以下步骤操作:

    然后,G Suite 域的超级管理员必须完成以下步骤:

    1.在 G Suite 域的 Admin console 中,转到主菜单 > 安全 > API 控制
    2.在域范围委派窗格中,选择管理域范围委派
    3.点击新增
    4.在 Client ID 字段中,输入服务帐户的Client ID。您可以在 Service accounts page.
    5 中找到您的服务帐户的客户端 ID。在 OAuth 范围(逗号分隔) 字段中,输入应授予您的应用程序访问权限的范围列表。例如,如果您的应用程序需要在域范围内完全访问 Google Drive API 和 Google Calendar API,请输入: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
    6.点击授权

    重要提示:

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

    参考:

    【讨论】:

    • 谢谢,我完全忘了更新那个页面,所以我添加了范围并等待了一会儿,但似乎我仍然收到错误消息。我尝试将setSubject 用户设置为超级管理员帐户和具有驱动器设置和数据传输管理员角色的用户,但我得到了同样的错误。我还在问题中添加了我的请求生成器功能。
    • 没关系,明白了!我在尝试调试时遇到了其他问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多