如何授权GAS Web应用程序代表用户操作?

问题描述 投票:0回答:1

所以我花了几个月的时间创建了一个编辑器插件并对其进行了验证。它现在以“未列出”的形式发布,但是,我无法让一些关键元素发挥作用。希望有人能帮忙解决这个问题。

现状

简而言之,我的附加组件有一个用于与 Telegram 机器人集成的 Web 应用程序部署。据推测,用户发送给机器人的任何信息都会以某种方式得到处理并反映在电子表格中。

在我决定将其制作成独立的附加组件之前,它在脚本的包含版本中运行得非常完美;但是,现在当其他用户尝试使用它时,它不会真正起作用。我认为这是因为我的 Web 应用程序是作为“我”(脚本所有者)执行的,而“我”无权访问最终用户的电子表格(理应如此)。因此,集成工作得很好,直到执行时

SpreadsheetApp.openById(sheetId)
- 然后它会出现错误:

Exception: You do not have permission to access the requested document.

对我不起作用的解决方案

  • 要求用户共享工作表:我计划在某个时候打开此脚本以供免费使用。我想保护用户的隐私。让他们与我分享他们的电子表格感觉不太合适;但是,也许如果我可以通过服务帐户使其工作,则此请求可以接受。
  • 作为“访问网络应用程序的用户”执行:不起作用,因为 Telegram 可以匿名访问网络应用程序。虽然提供匿名访问的唯一方法是使用“以我身份访问”而不是“以用户身份访问”。

可能的解决方案

对于应用程序的开发,我使用

clasp
- 一种有助于将本地 IDE 与 GAS 集成的工具。这个工具需要授权,它通过生成如下链接来请求授权:

https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.deployments%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.projects%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.webapp.deploy%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fservice.management%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.read%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&response_type=code&client_id=XXXXXXXXXXXX&redirect_uri=http%3A%2F%2Flocalhost%3A54470

通过点击此链接,我最终会进入 oAuth 屏幕,在其中选择我的帐户并授予对此应用程序的访问权限以代表我执行操作。我相信它使用来自Credentials屏幕的ID,并且我想如果我可以为我的Web应用程序生成这样的链接并将其提供给用户来执行授权,那么系统就可以工作。

现在,只需了解如何创建这样的链接、使用什么 ID 以及如何确保我的 Web 应用程序在提供的授权下启动。

也许还有其他解决方案?服务帐号?我对想法非常开放。

PS:我知道这个问题已经以这样或那样的方式得到了回答;但我无法找到一个案例来解释如何在我的设置中实现结果(这是纯 GAS、网络应用程序和连接到它的 Telegram 机器人)。作为一名初学者开发人员,我无法将这些建议应用到我的案例中。我将不胜感激任何建议!

google-apps-script google-sheets web-applications google-oauth telegram-bot
1个回答
0
投票

服务账号流程:

您可以提供一个请求授权的菜单,完成后,会将当前工作表共享到您服务帐户的电子邮件。然后,您可以使用服务帐户凭据通过工作表 API 访问工作表。请特别小心,避免泄露凭证。

访问令牌存储:

访问令牌每小时都会过期,但您可以使用已安装的触发器将从

ScriptApp.getOAuthToken
检索到的令牌存储到脚本属性。然后可以从匿名 Web 应用程序执行中检索此信息,因为它们共享脚本属性。但是,我相信这会带来多种攻击场景,从安全角度来看我不会推荐这样做。

© www.soinside.com 2019 - 2024. All rights reserved.