如何在调用执行 API 之前刷新 OAuth 令牌?

How to refresh an OAuth token before calling the Execution API?

我正在从我的网络应用中调用应用脚本执行 API。我正在获取 ScriptApp.getOauthToken() 并将其存储在 sheet 中。当我打开我的网络应用程序时,我将获得存储的访问令牌并在它的帮助下调用执行 API。

但问题是,一段时间后令牌会过期并且显示

authorization is required

当我调用执行时API.

有什么方法可以使访问令牌保持活动状态或在需要时刷新它?

我。你不能也不应该。至少不是原生

没有原生 Google Apps 脚本服务方法来获取和交换不记名令牌的刷新令牌(如果您想刷新过期的 OAuth 2.0 令牌,则需要一个)。也就是说,没有实际理由存储通过 getOauthToken 方法获得的 short-lived 令牌 - 如果用户授权您的应用程序,您可以在每次需要发出请求时即时请求令牌。

二.如果您仍然想要,请使用库

有一个 officially endorsed library for Google Apps Script 可以为您管理 OAuth 2.0 流程。使用时,在发放token时将离线访问设置为true即可获得refresh token

三.如果你真的想DIY,你可以随时制作自己的流量

通过构建自定义 JWT 令牌并将其与 Google Identity Platform 端点交换,可以仅使用本机工具来执行完整的 Oauth 2.0 流程(无论是否有用户交互)。但这意味着您将不得不管理 一切:

  1. 构建 JWT 自定义令牌 headers 和有效载荷,然后对其进行 base64 url​​encode 并使用适当的签名进行签名并连接成令牌。
  2. 将自定义 JWT 交换为 short-lived 不记名令牌,对其进行验证并提取到期时间,然后保留令牌。
  3. 每次从存储中获取令牌时,检查过期时间,然后使用第 1 - 2 点中的过程重新颁发令牌。
  4. 处理令牌撤销(请注意,您无法通过 Google 的服务器使它失效,只能在您的应用程序中)。
  5. 还有更多注意事项。

请注意,令牌不能“保持活动状态”,这违背了 OAuth 协议背后的理念 - 单个令牌的寿命越短,应用程序的安全性就越好。