Google apps script 用于多用户的Google脚本OAuth

Google apps script 用于多用户的Google脚本OAuth,google-apps-script,oauth-2.0,Google Apps Script,Oauth 2.0,我已经创建了一个处理2个不同OAuth连接的Google应用程序脚本 1-谷歌自己代表用户发送邮件并访问谷歌文档(谷歌api控制台用于获取密钥、密码) 2-gtraxapp wich是一款基于时间表的云应用程序。(脚本已注册,获得密钥/机密等) 该脚本将作为web应用程序发布。它非常适合我的用户 当登录到不同的用户名时,我可以授权GoogleOAuth,而无需提供不同的密钥/密码,电子邮件将从实际用户处发送 第二个应用程序(gTrax)出现问题。 授权似乎有效。在脚本中运行函数以授权引导到请求权

我已经创建了一个处理2个不同OAuth连接的Google应用程序脚本

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

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

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

当登录到不同的用户名时,我可以授权GoogleOAuth,而无需提供不同的密钥/密码,电子邮件将从实际用户处发送

第二个应用程序(gTrax)出现问题。 授权似乎有效。在脚本中运行函数以授权引导到请求权限的屏幕,然后gtrax将作为注册的应用程序出现在帐户中(如果需要,可以撤销访问)。 但是,当运行应用程序时,我会收到一条消息,说我需要执行此操作的权限(UrlFetchApp/simple get)

我的问题是:

我是否可能需要注册每个用户以获得每个人的密钥/机密(并在脚本中处理该密钥/机密)。。。 或者OAuth是否可以使用1个密钥/密码注册


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

我的理解是这样的。当您使用内置的应用程序脚本功能(如
MailApp.sendmail
)时,谷歌应用程序脚本“环境”会帮助您为用户请求授权(用户第一次访问您的应用程序时),并为您保存和管理oAuth令牌,因此一切都会顺利运行

当您使用
UrlFetchApp
调用外部服务时,应用程序脚本oAuth授权过程的工作方式不同。授权只是脚本编辑器上的一个奇怪弹出窗口,当您实际执行
fetch
调用时。它不会在“编译时”进行处理,并且在运行任何与其他服务类似的服务之前进行询问。但这一步也只做一次。 “问题”在于,当用户以Web应用程序的形式运行应用程序时,这种不同的授权过程不起作用。AFAIK只能从脚本编辑器本身或直接从电子表格运行

如果您的用户只是为数不多的人,您可以建议所有人打开脚本编辑器(或包含它的电子表格),然后运行一个特定的函数,该函数只需尝试
UrlFetchApp.fetch
调用,这样弹出窗口就会出现,他们就会对其进行授权。完成此步骤后,他们可以正常使用webapp。在那之后,应用程序脚本将为您发挥神奇的作用

但是如果你打算广泛地分享这一点,比如在Chrome网络商店,并且不想让每个用户都做这一有点奇怪的步骤,那么你需要自己管理所有的授权过程。这意味着,你必须向第三方服务注册你的应用程序(如果是谷歌的,则在API控制台),在那里你将收到
客户id
客户机密
。对于这些,你必须在你的应用程序html上放置一个“授权”提交按钮,该按钮将用户重定向到第三方授权url,提供正确的范围等。当他们授权时,第三方将用户重定向回你的应用程序,提供一个
code
令牌作为url参数。您将使用此
code
调用第三方oAuth服务,以获取真正的
访问权
,并可能
刷新
令牌,您必须在
UrlFetch
调用中使用这些令牌。您将负责保存这些令牌,并在它们过期时刷新它们,等等。这不是一个非常简单的过程:-/

哦,虽然你的应用程序只有一个
id
secret
,但代币是每个用户的。这是有道理的,因为你每次打电话都必须代表一个特定的用户,而且他必须已经授权


我希望这能有所帮助。

我想我错过了什么。有关simple UrlFetchApp的错误消息似乎不合适。您是否部署应用程序以作为您或最终用户运行?您是使用/dev链接还是/exec链接进行测试?这似乎与oAuth无关,但可能还有更多。你能提供一点关于确切错误消息的详细信息吗(可能是截图?)事实上,我离让它工作不远,我只需要构建一个“非常简单”的函数,使用fetch并完成OAuth。从我所看到的情况来看,要使流程正常运行,您必须“完成”一个事务,而不仅仅是发送信息和允许应用程序。你必须接收数据。然后,您的应用将被允许从web应用访问。谢谢您的回答。这让我进一步调查,我发现我的功能有些问题。为了允许授权,我简化了另一个函数,该函数使用1个带有OAuth信息的fetch请求,并且工作正常。我希望有一天谷歌会在Web应用程序中简化OAuth过程。。。此应用程序将在内部用于生成时间表,因此配置每个人并不太困难……但它仍然太复杂。是的,
Urlfetch
oAuth过程不像内置服务身份验证那么简单。我很高兴我帮了忙。顺便说一句,既然你是StackOverflow的新手,当你觉得自己得到了一个好答案时,你应该将答案标记为已接受。投票箭头附近有一个复选图标。