当有人像我一样运行 Google Apps Script 网络应用程序时获取用户信息

Rac*_*ist 5 authentication google-apps-script

我有一个独立的 Google Apps 脚本部署为网络应用程序。该应用程序以我的身份执行,因为我希望它访问存储在我的 Drive 上的文件,并且因为我希望它生成 Google Sheets 文件,这些文件的某些范围对用户提供保护,这些范围仍然可以通过脚本进行编辑。但是,我希望将这些文件隔离到文件夹中,并且每个文件夹都分配给一个用户,因此每次应用程序运行时我都需要知道用户是谁。

Session.getActiveUser().getEmail() 不起作用,因为网络应用程序是作为我而不是用户部署的。我的另一个想法是让应用程序“对所有人可用,甚至匿名”(现在它只是“对所有人可用”)跳过谷歌的登录屏幕,并使用某种第三方身份验证服务或脚本。构建我自己的似乎有点矫枉过正,因为这似乎应该已经存在,但到目前为止,我的研究只发现像 Auth0 这样的东西似乎与我简单的基于 Google Apps 脚本的应用程序不兼容,否则我太缺乏经验而无法弄清楚如何使用它们。

有没有人对如何为此类 Web 应用验证用户身份有任何建议?最好是带有初学者友好的教程或文档的东西?或者,是否有另一种方法可以让我找出谁在运行该应用程序,同时仍以我自己的身份执行它?

我对此很陌生,我什至不确定我是否以正确的方式提出了这个问题,因此对建议的编辑表示感谢。

Dim*_*gns 4

我可以想到两种方法来解决此问题,其中部署 Web 应用程序以在用户访问它时执行:

  1. 场景 A: 创建一个服务帐户来访问存储在云端硬盘上的文件并生成 Google 表格。
  2. 场景 B: 创建一个单独的 Apps 脚本项目,部署为 API 可执行文件,并从主 Web 应用程序调用其函数。

这些方法都是可行的,但每种方法都有许多优点和缺点。

两者都需要 OAuth2 身份验证,但由于Eric Koleda 的 OAuth2 库,这一点相当容易处理。

此外,在这两种情况下,您都需要将主 Apps 脚本项目绑定/链接到 GCP 项目,并启用适当的服务,在您的情况下是 Google Sheets 和 Google Drive API(有关更多详细信息,请参阅文档)。

对于场景 A,必须在同一 GCP 项目下创建服务帐号。对于场景 B,API 可执行文件的辅助 Apps 脚本项目也必须绑定到同一 GCP 项目。


场景 A 的特定问题

您需要与服务帐户共享要访问/修改(和/或在其中创建内容)的文件和文件夹。该服务帐户有自己的电子邮件地址,您可以与其共享 Google 云端硬盘文件/文件夹,就像与任何其他 Gmail 帐户共享一样。

对于新创建的内容,权限可能是一个问题,但幸运的是,在文件夹下创建的文件继承了该文件夹的权限,因此您应该在这方面做得很好。

但是,您必须直接使用 Drive 和 Sheets 服务的 REST API;通过 UrlFetch 以及服务帐户的访问令牌(使用 OAuth2 库生成)调用它们。


场景 B 特有的问题

您需要设置一个单独的 Apps 脚本项目并构建可由第 3 方调用的公共 API(非私有函数的集合)。

将脚本绑定到与主 Web 应用程序相同的 GCP 项目后,您需要从 IAM(身份访问管理)面板下的 GCP 控制台生成额外的 OAuth2 凭据。

您将使用客户端 ID 和客户端密钥来生成特定于您的帐户的刷新令牌(使用 OAuth2 库)。然后,您将在主 Web 应用程序中使用此刷新令牌来生成 API 可执行文件所需的访问令牌(也使用 OAuth2 库)。与前面的场景一样,您需要使用 UrlFetch 来使用生成的访问令牌调用 API 可执行文件上的方法。

需要注意的一件事是,您不能在 API 可执行代码中使用触发器,因为它们是不允许的。


显然,我已经掩盖了很多细节,但这应该足以让您开始。

祝你好运。