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
相关产品推荐
相关产品推荐

