我创建了一个处理2个不同OAuth连接的Google App脚本。
1- Google本身代表用户发送邮件并访问google docs(用于获取密钥的google api控制台,秘密)
2- gtraxapp这是一个基于时间表的云应用程序。 (脚本已注册,有密钥/秘密等)
该脚本作为Web应用程序发布。它非常适合我的用户。
使用其他用户名登录时,我可以在不提供不同密钥/密码的情况下授权Google OAuth,并且会从实际用户发送电子邮件。
第二个应用程序(gTrax)出现问题。 授权似乎有效。在脚本内运行该功能以授权导致屏幕要求许可,然后gtrax作为注册的应用程序出现在帐户中(如果需要可以撤销访问权限)。 但是,在运行应用程序时,我收到一条消息,说我需要获得执行此操作的权限(UrlFetchApp / simple get)
我的问题是:
这是否可能需要注册每个用户以获取每个人的密钥/秘密(并在脚本中处理)... 或者OAuth可以使用1密钥/密钥注册吗?
换句话说,(应该)密钥/秘密链接到单个用户,或者它们只是一种类似RSA的密钥对,经验证后可用于授权任何用户。
答案 0 :(得分:3)
我的理解是这样的。当您使用内置的Apps脚本功能(例如MailApp.sendEmail
)时,Google Apps脚本“环境”会照顾您的用户授权(第一次访问您的应用)并保存和管理oAuth令牌你,所以一切顺利。
使用UrlFetchApp
调用外部服务时,Apps脚本oAuth授权过程的工作方式不同。当您实际进行fetch
调用时,授权只是您在脚本编辑器上获得的一个奇怪的弹出窗口。它不会在“编译时”处理,并在您运行其他服务之前询问。但是你也只做了一次这个步骤。
“问题”是当用户将应用程序作为webapp运行时,这种不同的授权过程不起作用。 AFAIK只能从脚本编辑器本身运行或直接从电子表格运行。
如果您的用户只是少数人,您可以建议所有人打开脚本编辑器(或包含它的电子表格)并运行一个特定的功能,只会尝试UrlFetchApp.fetch
调用,以便弹出窗口显示他们授权。完成此步骤后,他们可以正常使用webapp。在此之后,Apps脚本将为您带来魔力。
但是,如果您打算广泛分享这一点,比如在Chrome网上应用店,并且不想让每个用户都做这个有点奇怪的步骤,那么您需要自己管理所有授权过程。这意味着,您必须使用第三方服务注册您的应用程序(如果它是Google的,它位于API控制台),您将收到client id
和client secret
。有了这些,你必须在你的应用程序html上放置一个“授权”提交按钮,将用户重定向到第三方授权网址,提供正确的范围等。当他们授权时,第三方将重定向用户在您的应用中提供code
令牌作为网址参数。您将使用此code
来调用第三方oAuth服务,以获取您必须在access
电话上使用的真实refresh
和可能UrlFetch
令牌。您将负责保存这些令牌,在过期时刷新它们等等。不是一个非常简单的程序: - /
哦,虽然您的应用只有一个id
和secret
,但令牌是每个用户。这是有道理的,因为你做的每次通话必须代表特定的用户,并且*必须*已经授权。
我希望这会有所帮助。