问题
我们(我和一位同事)有一些代码非常适合 webapp 的用例,除了对我们域之外的用户进行身份验证。如果不是因为这个问题,我们本来希望使用以下配置(在清单文件的顶层)。
"webapp": {
"access": "ANYONE",
"executeAs": "USER_DEPLOYING"}
对于我们域内的用户,我们可以使用Session.getActiveUser()。然后,我们可以将其与我们的数据库进行比较,并显示仅对该帐户可见的敏感数据。
然而,对于我们域外的用户,Session.getActiveUser()
给出空字符串''
,所以我们不能用它来查询我们数据库中的信息,所以我们需要一些不同的东西。我们想出的是以下设置。
替代设置
"executeAs": "USER_ACCESSING"
我们使用和部署 webapp "oauthScopes": ["https://www.googleapis.com/auth/userinfo.email"]
。我们使用特权帐户将另一个脚本部署为 API 可执行文件(并按照此处的说明进行操作)。webapp 的主 Code.gs 文件如下所示。
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index.html');
}
function getUserBackendData(){
//works for users outside our domain
var activeUserEmail = Session.getActiveUser();
var apiKey = 'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc'
var scriptId = 'ababababababababababababababababababababababab';
var token = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'; //very secret
var url = 'https://script.googleapis.com/v1/scripts/'+ scriptId +':run?key='+ apiKey;
var functionCallData =
{
"function": 'retrieveData',
"parameters": [activeUserEmail],
"devMode": false};
var options = {
'method' : 'post',
'contentType': 'application/json',
'payload' : JSON.stringify(functionCallData),
'headers': {'Authorization': 'Bearer '+ token}
};
return UrlFetchApp.fetch(url, options).getContentText();
}
这个想法是,这允许我们以retrieveData(activeUserEmail)
特权用户的身份在我们的 API 可执行文件中执行该函数,同时使用 webapp 来找出访问该应用程序的用户的电子邮件地址。Session.getActiveUser()
现在适用于我们域之外的用户的原因是我们部署为"executeAs": "USER_ACCESSING"
.
问题)
我们担心的是 1) 有一种更简单/更好的方法来做到这一点,以及 2) 访问 webapp 的用户可以以某种方式检索用于调用 api 可执行文件中的函数的令牌,我们担心这可能会被用来窃取私人数据。
此问答涉及关注点 2。不幸的是,答案没有引用任何官方文档/资源(并且并不都同意)。此外,在那里,秘密库密钥不存在于 webapp 的源代码中(它在清单文件中),而在我们的例子中,秘密令牌在源代码中。
问题:这种替代设置是否安全合理?
更新:我刚刚找到了这个答案,由一个看起来可信的用户撰写。答案是网络应用程序的用户将无法看到网络应用程序的代码,即使应用程序部署为“任何人,甚至匿名”。不过,这种说法是用“我知道的”来对冲的。