将 Google Apps Script Web 应用程序限制为仅限特定用户使用

Zee*_*mad 11 google-apps-script

制作一个网络应用程序,对我的 Google Drive 上的某些(表格)文件进行更改(即用户将像我一样使用该应用程序),但我想将网络应用程序访问权限限制为仅某些用户。部署应用程序时,我只能选择将其设为私有或公开。一种解决方案是使用会话类来查看是否有正确的用户登录。

function onAppBegin(){

 if (Session.getActiveUser().getEmail() != "correctappuser@gmail.com") return null;
 accessGranted();
}
Run Code Online (Sandbox Code Playgroud)

但是,我担心这种粗略的方法是否真的安全且不可破解?

小智 6

该方法太安全:没有人可以访问。如果您的 Web 应用程序是使用“执行应用程序为:我”选项进行部署的,则Session.getActiveUser().getEmail()可能会返回空字符串。请参阅文档

电子邮件地址可用的情况各不相同:例如,用户的电子邮件地址在任何允许脚本在未经用户授权的情况下运行的上下文中都不可用,例如部署为“以我的身份执行”的 Web 应用程序”(即由开发者而非用户授权)。但是,如果开发者和用户属于同一 G Suite 域,则这些限制通常不适用。

问题是,即使用户登录访问网络应用程序,他们也没有授权它代表他们做任何事情,例如查找他们的电子邮件地址。

如果 Web 应用程序部署为由“访问 Web 应用程序的用户”执行,则将要求他们对其进行授权,以便 Web 应用程序可以了解他们的身份。但是,它将只能修改用户已经可以直接修改的那些文件。

我解决这个困难的方法是为授权用户提供网络应用程序的密钥(一些长的随机字符串)。他们通过访问访问应用程序https://..../exec?key=mykey,应用程序按如下方式检查密钥:

function doGet(e) {
  if (e.parameter.key == "mykey") {
    var ss = SpreadsheetApp.openById("spreadsheet Id");  
    // modify the spreadsheet
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,这比您原来的方法更粗糙,但它有效。如果错误的人获得了密钥,他们将能够使用该应用程序,但损害将仅限于该应用程序的功能。这并不像有人访问您的 Google 帐户那么糟糕。