如何在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(管理员身份执行)
通过服务账号+私有脚本库实现,避免暴露管理员凭证:
- 在Google Cloud Console为项目创建服务账号,下载JSON密钥文件,同时在共享云端硬盘给该服务账号分配管理员权限。
- 创建私有脚本库,编写管理员操作逻辑(密钥存储在脚本属性中,不硬编码):
// 私有脚本库中的管理员操作函数 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()); } } - 将该脚本部署为私有脚本库,仅允许主Web应用脚本访问。主Web应用中直接调用库的公开方法即可触发管理员操作。
步骤2:隐藏敏感代码与凭证
- 管理员操作逻辑全部放在私有脚本库中,主Web应用仅调用库方法,用户无法查看库的代码内容。
- 所有敏感信息(服务账号密钥、共享盘ID)存储在**脚本属性(Script Properties)**中,通过
PropertiesService.getScriptProperties().getProperty()读取,用户无法查看这些属性。
关键注意事项
- 禁止硬编码管理员密码或服务账号密钥,避免凭证泄露。
- 服务账号权限需最小化,仅授予完成任务必需的Drive权限。
- 管理员操作的接口需添加权限校验,仅允许授权的主应用调用。
内容的提问来源于stack exchange,提问作者Sugukub
相关产品推荐
相关产品推荐

