制作一个网络应用,对我的Google云端硬盘上的某些(表格)文件进行更改(即用户将以我的身份使用该应用),但我想限制网络应用访问权限 仅限某些用户。在部署应用程序时,我只能选择将其设为私有或公开。 一种解决方案是使用会话类来查看是否有正确的用户登录。
function onAppBegin(){
if (Session.getActiveUser().getEmail() != "correctappuser@gmail.com") return null;
accessGranted();
}
但是,我担心这种原始方法是否真的安全且不可破解?
答案 0 :(得分:1)
该方法太安全:没有人可以访问。如果您的Web应用程序部署了选项"执行应用程序为:me",那么Session.getActiveUser().getEmail()
可能会返回空字符串。见documentation:
电子邮件地址可用的情况各不相同:例如,用户的电子邮件地址在任何允许脚本在没有该用户授权的情况下运行的上下文中都不可用,例如[.. 。]部署到&#34的Web应用程序;以我的身份执行" (即,由开发人员而不是用户授权)。但是,如果开发人员和用户属于同一G Suite域,则这些限制通常不适用。
问题是即使用户登录访问网络应用程序,他们也没有授权代表他们做任何事情,例如,查找他们的电子邮件地址。
如果部署的Web应用程序由用户访问Web应用程序"执行,则会要求他们对其进行授权,以便Web应用程序可以了解其身份。但是,它只能修改用户已经可以直接修改的文件。
我解决这个难题的方法是给授权用户一个Web应用程序的密钥(一些长的随机字符串)。他们通过转到https://..../exec?key=mykey
来访问应用,应用会按如下方式检查密钥:
function doGet(e) {
if (e.parameter.key == "mykey") {
var ss = SpreadsheetApp.openById("spreadsheet Id");
// modify the spreadsheet
}
}
现在,这比原来的方法更粗糙,但它确实有效。如果错误的人获得了密钥,他们将能够使用该应用程序,但损坏将仅限于应用程序可以执行的操作。它并不像有人访问您的Google帐户那么糟糕。