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

Google Workspace插件用户API密钥安全存储方案及隐私需求咨询

解决方案:安全存储用户API密钥并隔离开发者访问

核心结论:PropertiesService.getUserProperties() 已满足你的核心需求

首先明确一个关键事实:PropertiesService.getUserProperties() 存储的数据仅对当前用户可见,脚本开发者(即使是所有者)也无法读取其他用户的存储内容。这完全符合你“包括自己在内的任何人都无法访问用户密钥”的核心要求。


针对你的顾虑的具体解答

1. getUserProperties() 的安全性

这种方式是相对安全的:

  • Google 会对用户属性数据进行加密存储和传输,其他用户或第三方无法直接获取;
  • 风险仅来自用户自身 Google 账号被盗,或脚本被授予过度权限(你可以通过限制脚本的 OAuth 权限范围降低此风险);
  • 密钥以明文存储在 Google 的安全系统中,虽不如端到端加密,但在大部分场景下已足够安全。

2. 误写为 getScriptProperties() 的风险

可以通过以下手段彻底规避:

  • 封装统一的属性操作函数:禁止直接调用 PropertiesService,仅通过封装后的工具类操作用户属性:
    // 封装用户属性操作,杜绝误触 ScriptProperties
    const UserPropertyStore = {
      getApiKey: () => PropertiesService.getUserProperties().getProperty('api_key'),
      saveApiKey: (key) => PropertiesService.getUserProperties().setProperty('api_key', key)
    };
    
    // 使用示例
    function saveApiKeyFn(e) {
      const api_key = e.formInput.api_key;
      UserPropertyStore.saveApiKey(api_key);
      // ... 后续逻辑
    }
    
  • 添加代码检查规则:用 ESLint 等工具添加自定义规则,禁止调用 getScriptProperties(),代码提交时自动拦截错误;
  • 代码注释与规范:在关键位置添加醒目标注,或使用 TypeScript 类型约束限制方法调用。

备选方案(更高安全需求场景)

如果对安全性有更极致要求,可考虑以下方案:

  • 临时输入密钥:不存储密钥,每次调用 API 前让用户输入,用完即丢弃。缺点是用户体验较差,但完全避免存储风险;
  • OAuth 2.0 替代 API 密钥:若外部服务支持 OAuth 认证,引导用户通过授权获取访问令牌,脚本仅存储短期有效的令牌而非永久密钥。令牌无法反推原密钥,安全性更高;
  • 用户端加密存储:让用户设置自定义密码,输入密钥后先加密再存储,解密时需用户输入密码。即使加密内容泄露,无密码也无法获取原密钥,但会增加用户记忆负担。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:50:23