首页 > 解决方案 > 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 应用程序?我想将用户相关数据保存到该特定用户的专用电子表格中。所以我需要以某种方式识别用户。

更新 要明确我想要实现的目标

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");
}

标签: google-apps-scriptgoogle-signin

解决方案


Bismillah ...嗨,我真的很高兴看到有人在做我所做的事情..

所以我要做的是:我创建了两个网络应用程序。

  1. 首先是以访问网络应用程序的用户身份执行,并且任何拥有 Google 帐户的人都可以访问
  2. 其次是像我一样执行并且任何人都可以访问

我在 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 应用程序,其参数称为eBase 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 个用户的事件注册。当然,如果此功能受到限制并最终崩溃,那将是很麻烦的。

希望对您有所帮助,我可以知道此功能的确切限制是什么。


推荐阅读