是否可以使用其他用户凭据授权管理服务?

Is it possible to authorize admin service with another user credential?

我想通过应用程序脚本为 GMail 编写一个附加组件,以显示一些管理目录数据。

但我希望此插件在与我的管理员帐户不同的帐户上运行。例如,我每天使用我的 daily-mail@google.com 来查看电子邮件,有时我使用我的 admin@google.com 帐户来管理管理内容。

有没有办法在登录为 daily-mail@google.com 时以 admin@google.com 使用管理服务?

答案:

假设此其他用户没有管理员权限,您唯一的选择是使用具有域范围授权的服务帐户来模拟您的管理员帐户:

工作流程:

  1. 创建 service account.
  2. 按照 this guide 授予服务帐户域范围的授权,以便它可以用来模拟您域中的任何帐户:在本例中是您的帐户。
  3. 导入并使用库 OAuth2 for Apps Script 以便在您的 Apps 脚本项目中使用服务帐户。
  4. 使用服务帐户中的访问令牌,使用 UrlFetchApp 调用所需的 API。

代码示例:

例如,如果您想调用目录 API 的 users.get 以从当前执行此操作的用户那里检索数据,您可以这样做:

function getService() {
  const service = OAuth2.createService("Service account")
                    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
                    .setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
                    .setIssuer(SERVICE_ACCOUNT_EMAIL)
                    .setSubject(IMPERSONATED_EMAIL)
                    .setPropertyStore(PropertiesService.getScriptProperties())
                    .setParam('access_type', 'offline')
                    .setScope('https://www.googleapis.com/auth/admin.directory.user')
  return service;
}

function getActiveUserData() {
  const service = getService();
  if (service.hasAccess()) {
    const userKey = Session.getActiveUser();
    const url = `https://admin.googleapis.com/admin/directory/v1/users/${userKey}`;
    const options = {
      headers: {
        'Authorization': "Bearer " + service.getAccessToken(),
        'Content-Type': 'application/json'
      },
      muteHttpExceptions: true
    }
    const resp = UrlFetchApp.fetch(url, options);
    const userData = JSON.parse(resp.getContentText());
    return userData;
  }
}