安全存储Google Apps脚本发布库中使用的API密钥 [英] Securely Storing API Secrets used in Google Apps Script - Published Library
问题描述
在Google Sheets中,有一个脚本使用&UrlFetchApp";从外部API获取信息,而该外部API要求在每个调用中包含API密钥。
工作表有多个编辑器,但只有所有者才能看到API密钥,因此不能将密钥存储在脚本本身或使用PropertiesService。
以下解决方案会阻止工作表编辑看到密钥吗?
新建独立Apps Script项目。
在独立脚本中,创建以下函数:
function fetchData(idFromSheetScript) { var secret = '/abc123'; var id = idFromSheetScript; var uri = 'https://.../'; var url = uri+id+secret; var data = UrlFetchApp.fetch(url); return data; }
将独立脚本部署为库。不要与任何人共享该项目。
在Google Sheets绑定脚本中,导入库并使用库中的fetchData()函数。
var response = fetchData('10');
导入库的工作表的编辑是能够查看或获取(通过记录或以其他方式)库中的";Secret";变量,还是只能查看函数的返回变量?
推荐答案
您的方法有问题:
库需要shared with atleast "view level" access to the end user,否则无法运行。因此,第3点是不可行的。
标识符为
检索MyLibrary
的库的库源代码也可以用console.log(MyLibrary.fetchData.toString()); //where fetchData is one of the function names in MyLibrary
可安装编辑触发器:
这些触发器run under the authority of the user who created the trigger。因此,库可以与一个用户/虚拟Google帐户共享,并让该用户安装触发器,同时限制其他所有编辑器对库源代码的访问。
但是,如果有恶意的编辑器,他们只需将onEdit()函数编辑为:
function onEditInstalled(){ SpreadsheetApp.getActiveRange().setValue(MyLibrary.fetchData.toString()) }
并编辑一些内容以获得源代码+API密钥。但是,如果可安装触发器具有更多权限(如访问Gmail或驱动器),并且如果设置为始终在最新部署时运行,则他们可以对创建触发器的用户执行更多恶意操作。
通过将触发器设置为Alwaysrun at a predetermined version和Not At Head/Latest Version,可以避免上述。在apps script dashboard user interface中设置触发器时可以更改此设置。要创建一个版本,您可以创建一个虚拟的库/Webapp部署或使用api。这可以保护代码不受任何修改,因为版本就像是当前代码的"快照"。一旦触发器被设置为在特定版本上执行,其他编辑者就不能更改它。目前,所有者或编辑也无法修改现有版本。Versions are immutable。
从script properties are not shared between the library and the including script开始,您可以使用它来隐藏API密钥。
另一个选项是将独立脚本部署为具有访问权限的web app:任何人,包括匿名用户,但使用身份令牌(
ScriptApp.getIdentityToken()
)使用您的身份验证机制。但您需要在Web应用端为ID令牌构建适当的验证机制。请注意,所有这些解决方法都不是针对安全性进行笔试的,而是作为基于经验的概念提供的。安全是相对的。欢迎批评。
这篇关于安全存储Google Apps脚本发布库中使用的API密钥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!