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授权流程申请离线访问权限:
- 在插件首次加载的逻辑里,额外发起一次标准OAuth2授权请求,请求时携带参数
access_type=offline、prompt=consent - 用户完成授权后,你会拿到对应账号的refresh token,把这个token存在你自己的服务端数据库中,后续离线访问时用这个refresh token换发新的access token即可
- 注意:插件默认弹出的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
相关产品推荐
相关产品推荐

