0

问题

我们(我和一位同事)有一些代码非常适合 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 的源代码中(它在清单文件中),而在我们的例子中,秘密令牌源代码中。

问题:这种替代设置是否安全合理?

更新:我刚刚找到了这个答案,由一个看起来可信的用户撰写。答案是网络应用程序的用户将无法看到网络应用程序的代码,即使应用程序部署为“任何人,甚至匿名”。不过,这种说法是用“我知道的”来对冲的。

4

1 回答 1

0

在大多数情况下,与其使用 API 可执行文件,不如向 Web 应用程序发出请求可能更明智。可以向 Web 应用程序发出 get 或 post 请求,使 Web 应用程序知道谁在发出请求(即Session.getActiveUser在 Web 应用程序中工作)。

有关详细信息,请参阅(我的其他答案):https ://stackoverflow.com/a/59428929/11873333

于 2020-01-09T13:21:47.510 回答