google-apps-script - GAS - 当网络应用程序部署为“任何拥有 Google 帐户的人”时,我可以获得 Google 登录用户详细信息吗?
问题描述
我有一个已部署的工作 GAS Web 应用程序
- 执行为 - 我
- 谁有权访问 - 任何人
现在我需要分离用户正在使用、存储、访问的数据。我正在考虑使用Google 登录,但后来我想,如果我将who has access
选项设置为Anyone with Google account
. 但是我无法在任何地方找到如何或什至我能够获得登录用户的任何详细信息。
唯一相关的信息是这个 SO question Get user info when someone running Google Apps Script web app as me。如果我可以在我的 GAS 代码中获取登录用户的详细信息,那么提出的解决方案https://stackoverflow.com/a/59974388/250422在我看来太复杂了。
或者有什么简单的方法可以通过登录来保护我的 GAS Web 应用程序?我想将用户相关数据保存到该特定用户的专用电子表格中。所以我需要以某种方式识别用户。
更新 要明确我想要实现的目标
- 有一个带有登录身份验证的 GAS Web 应用程序
- 此类应用程序的每个用户都有单独的 Google 电子表格文件存储在我的帐户下或我可以访问它但不是最终用户的地方
- 最好我会为登录部分使用现有的设施
UPDATE2 根据要求,我目前使用的代码是
function doGet() {
Logger.log("let us start");
var htmlTemplate = HtmlService.createTemplateFromFile('index');
// htmlTemplate.dataFromServerTemplate = { fromServer: zzlib.settings.toHTML};
var htmlOutput = htmlTemplate.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
var email = Session.getActiveUser().getEmail();
Logger.log(email);
tmplibX.saveFile(email);
HtmlService.createTemplateFromFile('index').evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) //SAMEORIGIN
return htmlOutput;
}
tmplibX.saveFile(email);
看起来像
function saveFile(fileName){
console.log("from library");
Logger.log("from library");
console.log(fileName);
var fileName=Session.getActiveUser().getEmail();
console.log(fileName);
DriveApp.createFile("FROM-LIB-"+fileName, 'Hello, world!');
console.log("finished");
}
解决方案
Bismillah ...嗨,我真的很高兴看到有人在做我所做的事情..
所以我要做的是:我创建了两个网络应用程序。
- 首先是以访问网络应用程序的用户身份执行,并且任何拥有 Google 帐户的人都可以访问
- 其次是像我一样执行并且任何人都可以访问
我在 First Web App 中写的是:
function doGet(e) {
var em = Utilities.base64EncodeWebSafe(Session.getActiveUser().getEmail(), Utilities.Charset.UTF_8)
return HtmlService.createHtmlOutput('<script>window.top.location.replace("https://script.google.com/macros/s/mySecondWebAppDeploymentID/exec?e='+em+'")</script>')
.setTitle('myTitle').setFaviconUrl('https://i.ibb.co/xxx/myLogo.png')
}
这将重定向到第二个 Web 应用程序,其参数称为e
Base 64 编码的用户电子邮件。这是我们可以获得的唯一数据。
然后在第二个 Web 应用程序中,您可以编写任何您想要的内容,例如重定向到预填充的 gform 或从电子表格中获取数据,然后将其与用户电子邮件匹配,而不是根据数据执行任何操作......
第二个Web App的基本代码是:
function doGet(e){
var email = Utilities.newBlob(Utilities.base64DecodeWebSafe(e.parameter.e,Utilities.Charset.UTF_8)).getDataAsString()
//Do whatever u want with that email string variable
}
实际上,我希望能找到其他人这样做,因为我想知道App Script 的“获取电子邮件”功能的限制是什么。
我计划将其用于估计用户最多 1000 个用户的事件注册。当然,如果此功能受到限制并最终崩溃,那将是很麻烦的。
希望对您有所帮助,我可以知道此功能的确切限制是什么。
推荐阅读
- python - Python中是否有办法将元素统一添加到列表中,无论它是否已经存在?
- google-cloud-platform - Google BigQuery:授予服务帐户权限以仅在某些特定数据集中创建作业
- java - ChaCha20-Poly1305 失败并出现 ShortBufferException 输出缓冲区太小
- algorithm - 从二维数组中选择所有可能的 3 个点
- java - 循环操作,直到元素不再可见
- python - 将数字格式化为科学计数法,但使用 3e-5 而不是 3e-05
- java - Mocked service not called
- php - Laravel - 选择不保留旧值的输入
- python - 将用户输入保存为不和谐机器人的临时变量
- c++ - 无法使用 Nuget 安装软件包