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

NextAuth.js中JWT令牌过期设置与自动刷新问题

NextAuth.js 4.17.0 JWT过期配置问题解决方案

核心问题拆解

  • 你设置的maxAge是控制session的有效期,并非JWT本身的过期时间,所以解码JWT看不到exp字段是正常现象
  • 直接在jwt.SignOptions中添加expiresIn报错,是因为NextAuth默认会自动生成exp字段,手动设置会触发冲突

正确配置方案

1. 通过jwt回调自定义JWT过期时间

在[...nextauth].js的jwt回调里手动生成exp字段,同时保留必要的用户信息:

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"

export default NextAuth({
  providers: [
    CredentialsProvider({
      // 你的认证逻辑实现
    })
  ],
  callbacks: {
    async jwt({ token, user }) {
      // 首次登录时初始化token并设置15分钟过期(单位:秒)
      if (user) {
        token.id = user.id
        token.exp = Math.floor(Date.now() / 1000) + 15 * 60
      }
      return token
    },
    async session({ session, token }) {
      // 将JWT过期时间同步到session,方便前端判断
      session.user.id = token.id
      session.expires = new Date(token.exp * 1000).toISOString()
      return session
    }
  },
  session: {
    strategy: "jwt",
    // 保持session有效期和JWT过期时间一致
    maxAge: 15 * 60
  }
})

2. 实现令牌自动刷新

NextAuth的自动刷新需要依赖前端的session调用,同时在jwt回调中判断令牌是否即将过期,触发刷新:

async jwt({ token }) {
  const now = Math.floor(Date.now() / 1000)
  // 当令牌剩余有效期不足1分钟时,刷新过期时间
  if (token.exp - now < 60) {
    token.exp = now + 15 * 60
  }
  return token
}

前端调用useSession或getSession时,会自动检查令牌状态,触发上述刷新逻辑,无需手动调用刷新接口。

3. 规避expiresIn报错的注意事项

绝对不要在jwt.SignOptions中设置expiresIn,NextAuth的JWT处理逻辑会自动生成exp字段,手动设置必然触发冲突报错,所有过期相关配置都通过jwt回调完成。

验证配置有效性

  • 生成JWT后,用Base64解码查看exp字段,确认是当前时间+15分钟的时间戳
  • 等待15分钟后,前端调用getSession会返回null(未触发刷新时),或自动获取到新的JWT

内容的提问来源于stack exchange,提问作者Dominik Jeník

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:42:44