You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OAuth2Client获取Google Workspace插件refreshToken报错解决

报错根因

你当前的实现逻辑不符合Google Workspace插件的授权机制,报错是必然结果:

  • Google Workspace插件框架下发的userOAuthToken是平台托管的短时效访问令牌,内置授权流不会向插件返回refresh token
  • 你在代码里仅向OAuth2Client传入了access_token,没有传入refresh_token字段,调用刷新接口时客户端找不到用于换发新令牌的凭据,直接抛出No refresh token is set错误。
修复方案

根据你的使用场景选对应方案即可:

场景1:仅在插件交互、Google推送回调时调用Google API(90%以上插件的场景)

完全不需要自己获取refresh token、手动维护令牌刷新逻辑:

  • 插件前端(卡片交互、事件触发逻辑)调用Google API时,直接用运行时拿到的userOAuthToken即可,令牌过期时插件框架会自动完成续期,无需额外处理
  • 你现在接的后端回调接口,每次Google发请求过来时,authorizationEventObject.userOAuthToken字段都会携带当前最新的有效access token,直接拿这个token调用接口就行,每次回调带的token都是有效期内的,不需要提前刷新存储。

场景2:需要在用户未触发插件时(比如后台定时任务、离线推送)主动调用Google API

这种场景不能依赖插件默认的内置授权流,需要单独走标准OAuth2授权流程申请离线访问权限:

  1. 在插件首次加载的逻辑里,额外发起一次标准OAuth2授权请求,请求时携带参数access_type=offline、prompt=consent
  2. 用户完成授权后,你会拿到对应账号的refresh token,把这个token存在你自己的服务端数据库中,后续离线访问时用这个refresh token换发新的access token即可
  3. 注意:插件默认弹出的scope授权确认是平台内置的授权流,只会返回短时效access token,不会返回refresh token,必须单独走一次标准OAuth授权流程才能拿到离线访问凭据。

拿到refresh token后,令牌刷新的代码要调整为如下写法,必须传入refresh_token字段:

const { OAuth2Client } = require('google-auth-library');
const auth = new OAuth2Client(
  // 填入你Google Cloud项目对应的OAuth客户端凭据
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URI
);
auth.setCredentials({
  refresh_token: 你服务端存储的对应账号refreshToken
});
auth.refreshAccessToken()
  .then((res) => {
    const newAccessToken = res.credentials.access_token;
    // 用新的access token调用接口即可
  })
  .catch((err) => {
    console.error(err);
  });

内容的提问来源于stack exchange,提问作者Manu Jo Varghese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:15:40