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

Nodemailer出现no refresh token或refresh handler callback is set错误如何解决

报错根因
  • Google Cloud OAuth 应用处于测试状态:未升级为生产状态的Google OAuth应用,所有生成的refresh token默认有效期仅为7天,到期后会自动失效,这是refresh token频繁过期的核心原因。
  • OAuth 2.0 Playground 生成token的调试限制:OAuth 2.0 Playground是官方提供的调试工具,生成的refresh token本身就有额外的生命周期限制,本身不适合用于生产环境长期运行。
  • 代码缺少token刷新兜底逻辑:当前代码仅在初始化时静态写入固定的refresh token,当refresh token失效后,OAuth客户端没有可调用的更新逻辑,就会抛出no refresh token or refresh handler callback is set报错。
解决方案

1. 将OAuth应用发布为生产状态

登录Google Cloud控制台,进入「API和服务」-「OAuth同意屏幕」页面,将应用的发布状态从「测试」调整为「生产」。如果是仅个人/企业内部账号使用的内部应用,无需提交Google审核,调整后立即生效,refresh token的7天过期限制会自动解除。

2. 替换调试用refresh token

发布应用后,重新走一次正式的OAuth授权流程获取长效refresh token,不要继续使用OAuth 2.0 Playground生成的调试token。如果是个人自用场景,也可以在应用发布后重新通过Playground生成一次refresh token,此时生成的token不再受7天有效期限制。

3. 补充token自动刷新逻辑

修改现有代码,添加token更新回调,当refresh token被滚动更新时自动持久化新token,避免固定静态token失效后无可用凭证:

const oAuth2Client = new google.auth.OAuth2(
  CLIENT_ID,
  CLIENT_SECRET,
  REDIRECT_URI
);

oAuth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });

// 新增token刷新回调
oAuth2Client.on('tokens', (tokens) => {
  if (tokens.refresh_token) {
    // 此处将新的refresh_token持久化存储到配置文件/数据库中
    REFRESH_TOKEN = tokens.refresh_token;
  }
  oAuth2Client.setCredentials(tokens);
});

google.options({ auth: oAuth2Client });

额外注意事项

  • 不要为同一个账号+客户端组合频繁生成新的refresh token,Google对该组合的refresh token数量有上限限制,超过上限后最早生成的token会自动失效。
  • 不要修改Google账号的密码、权限或者撤销应用授权,以上操作都会导致现有refresh token直接失效。

内容的提问来源于stack exchange,提问作者SarahAlexa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:03