You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Apps Script中以不同账户执行函数且不泄露管理员凭证?

Google Apps Script 实现双身份执行方案

核心原则

绝对不能硬编码管理员密码(严重安全风险),需通过Google 服务账号授权+脚本权限隔离实现,同时利用私有脚本库隐藏敏感逻辑。

步骤1:分离两个函数的执行身份

函数1(访问用户身份执行)

直接在Web应用的入口函数中实现,部署时选择**「以访问应用的用户身份执行」**,函数会自动使用当前访问用户的Google账户权限操作共享云端硬盘,无需额外处理。

示例代码:

function doGet(e) {
  // 函数1:用当前用户权限操作共享云端硬盘
  const sharedDriveId = PropertiesService.getScriptProperties().getProperty("SHARED_DRIVE_ID");
  const userDrive = DriveApp.getSharedDriveById(sharedDriveId);
  // 执行用户权限允许的操作(如列出文件)
  const fileList = Array.from(userDrive.getFiles()).map(file => file.getName());
  return ContentService.createTextOutput(JSON.stringify(fileList));
}

函数2(管理员身份执行)

通过服务账号+私有脚本库实现,避免暴露管理员凭证:

  1. 在Google Cloud Console为项目创建服务账号,下载JSON密钥文件,同时在共享云端硬盘给该服务账号分配管理员权限。
  2. 创建私有脚本库,编写管理员操作逻辑(密钥存储在脚本属性中,不硬编码):
    // 私有脚本库中的管理员操作函数
    function adminDriveTask() {
      const serviceKey = JSON.parse(PropertiesService.getScriptProperties().getProperty("SERVICE_ACCOUNT_KEY"));
      const sharedDriveId = PropertiesService.getScriptProperties().getProperty("SHARED_DRIVE_ID");
    
      // 初始化OAuth2服务
      const oauthService = OAuth2.createService('AdminDriveAccess')
        .setTokenUrl('https://oauth2.googleapis.com/token')
        .setPrivateKey(serviceKey.private_key)
        .setIssuer(serviceKey.client_email)
        .setPropertyStore(PropertiesService.getScriptProperties())
        .setScope('https://www.googleapis.com/auth/drive');
    
      if (oauthService.hasAccess()) {
        // 调用Drive API执行管理员操作(如修改共享权限)
        Drive.Permissions.create(
          {role: "writer", type: "user", emailAddress: "target@example.com"},
          `drive/${sharedDriveId}`,
          {supportsAllDrives: true, headers: {'Authorization': 'Bearer ' + oauthService.getAccessToken()}}
        );
        return "管理员操作执行完成";
      } else {
        throw new Error(oauthService.getLastError());
      }
    }
    
  3. 将该脚本部署为私有脚本库,仅允许主Web应用脚本访问。主Web应用中直接调用库的公开方法即可触发管理员操作。

步骤2:隐藏敏感代码与凭证

  • 管理员操作逻辑全部放在私有脚本库中,主Web应用仅调用库方法,用户无法查看库的代码内容。
  • 所有敏感信息(服务账号密钥、共享盘ID)存储在**脚本属性(Script Properties)**中,通过PropertiesService.getScriptProperties().getProperty()读取,用户无法查看这些属性。

关键注意事项

  • 禁止硬编码管理员密码或服务账号密钥,避免凭证泄露。
  • 服务账号权限需最小化,仅授予完成任务必需的Drive权限。
  • 管理员操作的接口需添加权限校验,仅允许授权的主应用调用。

内容的提问来源于stack exchange,提问作者Sugukub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:05:39