3

我创建了一个处理 2 个不同 OAuth 连接的 Google App 脚本。

1-谷歌自己代表用户发送邮件并访问谷歌文档(谷歌API控制台用于获取密钥,秘密)

2- gtraxapp wich 是一个基于云的时间表应用程序。(脚本已注册,获得密钥/秘密等)

该脚本作为 Web 应用程序发布。它非常适合我的用户。

当以不同的用户名登录时,我可以在不提供不同密钥/秘密的情况下授权 Google OAuth,并且电子邮件将从实际用户发送。

第二个应用程序(gTrax)出现问题。授权似乎有效。在脚本中运行该功能以进行授权会导致屏幕请求权限,然后 gtrax 作为注册应用程序出现在帐户中(如果需要,可以撤销访问权限)。但是,在运行应用程序时,我收到一条消息说我需要权限才能执行此操作(UrlFetchApp / 简单获取)

我的问题是:

这可能是我需要注册每个用户以获取每个人的密钥/秘密(并在脚本中处理)......或者 OAuth 可以用 1 个密钥/秘密注册吗?

换句话说,是(应该)密钥/秘密链接到单个用户,还是它们只是一种类似 RSA 的密钥对,经过验证后,可用于授权任何用户。

4

1 回答 1

3

我的理解是这样的。当您使用内置的 Apps 脚本功能时,例如MailApp.sendEmail,Google Apps 脚本“环境”会照顾您为用户请求授权(他第一次访问您的应用程序)并为您保存和管理 oAuth 令牌,所以这一切运行流畅。

当您使用 调用外部服务UrlFetchApp时,Apps Script oAuth 授权过程会有所不同。当您实际fetch拨打电话时,授权只是您在脚本编辑器上得到的一个奇怪的弹出窗口。它不会在“编译时”处理,而是在您运行其他服务之前询问。但是您也只执行此步骤一次。“陷阱”是当用户将应用程序作为 web 应用程序运行时,这种不同的授权过程不起作用。AFAIK 它仅适用于脚本编辑器本身或直接从电子表格运行。

如果您的用户只是少数已知的用户,您可以建议每个人打开脚本编辑器(或包含它的电子表格)并运行一个特定的函数,该函数将尝试UrlFetchApp.fetch调用,以便弹出窗口出现并对其进行授权。这一步完成后,他们就可以正常使用webapp了。之后,Apps Script 将为您施展魔法。

但是,如果您打算在 Chrome Web Store 上广泛分享,并且不想要求每个用户都执行这个有点奇怪的步骤,那么您需要自己管理所有授权过程。这意味着,您必须在第三方服务中注册您的应用程序(如果是 Google 的,则在 API 控制台),您将在其中收到 aclient idclient secret. 有了这些,您必须在您的应用程序 html 上放置一个“授权”提交按钮,该按钮会将用户重定向到第 3 方授权 url,提供正确的范围等。当他们授权时,第 3 方会将用户重定向回来向您的应用提供code令牌作为 URL 参数。你'codeaccessrefreshUrlFetch来电。您将负责保存这些令牌,在它们过期时刷新它们等等。不是一个非常简单的过程:-/

哦,虽然您的应用程序只有一个idand secret,但令牌是每个用户的。这是有道理的,因为您所做的每个呼叫都必须代表特定用户,并且他*必须*已授权。

我希望这有帮助。

于 2012-11-23T00:12:20.433 回答