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

