NextAuth v4 beta版本刷新时token不断嵌套问题如何解决
问题原因
这是NextAuth v4 beta版本的JWT回调参数结构变更+逻辑bug共同导致的:
- v3版本的JWT回调第一个参数是包含所有上下文的完整payload,直接返回整个参数是符合预期的写法;但v4版本对回调参数做了调整,JWT回调只有一个入参对象,对象内部包含
token、user、account等属性,其中token本身就是上一次回调生成的JWT序列化后的解析结果。 - v4 beta版本的回调处理逻辑存在bug,当你直接返回整个入参对象时,框架会把这个完整对象当做新的token值,挂载到下一次回调入参的
token属性下,每次刷新触发JWT回调就会多嵌套一层token,最终就会出现你遇到的token.token.token的无限嵌套问题。
解决方法
按以下步骤调整即可:
- 首先修正JWT回调的参数写法,先解构入参再返回核心token对象,不要直接返回整个入参:
jwt: async ({ token, user, account, profile, isNewUser }) => { // 仅当首次登录/授权有新的用户、账户信息传入时,才合并到token中 if (user) { token.user = user } if (account) { token.accessToken = account.access_token token.refreshToken = account.refresh_token } return token }
- 如果本地已经存在嵌套结构的旧token,需要加兼容逻辑处理历史数据,避免登录异常:
jwt: async ({ token, user, account }) => { // 提取真实token内容,兼容已经嵌套的旧数据 const validToken = token.token ?? token if (user) { validToken.user = user } if (account) { validToken.accessToken = account.access_token } return validToken }
- 如果你配置了自定义的
encode/decodeJWT序列化逻辑,同步检查逻辑是否存在重复包装token的问题,直接返回序列化后的纯字符串即可,不要额外套对象。
内容的提问来源于stack exchange,提问作者Ankush Verma
相关产品推荐
相关产品推荐

