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

nuxt/auth-next配置Google OAuth2无法获取refresh_token问题求助

核心原因

你配置的responseType: 'id_token token'走的是OAuth2隐式授权流,这个流程定位就是纯前端无服务端参与的轻量场景,Google出于安全限制,隐式流永远不会返回refresh_token,不管你撤销多少次授权、怎么调整prompt参数都没用。refresh_token属于高敏感凭证,只会在授权码(PKCE)流中下发。
另外你配置里的access_type写法不对,nuxt/auth-next的配置项用驼峰命名,下划线写法会导致offline权限配置根本没生效,codeChallengeMethod留空也会导致授权码流的换票流程失败。

修复步骤

按下面改配置即可:

  • 把responseType改成code,切到授权码+PKCE流,这是能拿到refresh_token的前置条件
  • 把codeChallengeMethod从空字符串改成S256,Google现在对公共客户端强制要求S256算法的PKCE校验,留空会直接报错
  • 把下划线写法的access_type改成驼峰的accessType,确保离线访问权限配置生效
  • 修正token字段映射:你之前把鉴权token的来源设成id_token是错的,授权码流返回的接口鉴权凭证是access_token,id_token只做用户身份校验用,要单独映射
  • 保留prompt: 'consent'配置,这个配置会强制每次跳转授权页都展示同意弹窗,确保每次授权都返回refresh_token,不用纠结是不是首次授权的问题

改完的完整配置参考:

auth: {
  strategies: {
    google: {
      clientId: process.env.GOOGLE_CLIENT_ID,
      scope: ['profile', 'email'],
      endpoints: {
        userInfo: `${process.env.API_URL}/user`
      },
      codeChallengeMethod: 'S256',
      responseType: 'code',
      accessType: 'offline',
      prompt: 'consent',
      token: {
        property: 'access_token',
        type: 'Bearer',
        global: true
      },
      idToken: {
        property: 'id_token'
      },
      refreshToken: {
        property: 'refresh_token',
        // 按需配置refresh_token自动刷新逻辑即可
        maxAge: 60 * 60 * 24 * 30
      }
    }
  }
}
验证注意事项
  • 配置改完先清掉浏览器localStorage、sessionStorage里所有带auth.前缀的缓存,再重新走登录流程,避免旧配置缓存干扰
  • 如果还是拿不到,再去Google账号权限页撤销一次应用授权重新授权就行,走对流程的情况下只要带了accessType: 'offline'和prompt: 'consent',每次授权都会返回refresh_token
  • 别再折腾隐式流拿refresh_token了,这是Google侧的安全规则限制,和nuxt/auth的配置逻辑没关系,隐式流天生就拿不到这个字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:06:20