Next.js 13中通过NextAuth动态设置Session maxAge实现记住我
解决NextAuth「记住我」功能的两个核心问题
第一步:强制登录请求为POST,传递rememberMe参数
调用signIn时,必须指定请求方法为POST,同时把rememberMe作为参数传入:
// 登录表单提交逻辑 const handleLogin = async (email: string, password: string, rememberMe: boolean) => { await signIn("credentials", { email, password, rememberMe, redirect: false, // 按需设置是否跳转 method: "POST" // 强制使用POST请求,确保参数能进入请求体 }); };
第二步:在授权回调中捕获参数,动态设置JWT过期时间
不能直接在session配置里用req.body,因为NextAuth初始化配置时还未进入请求上下文,得通过JWT回调动态控制过期时间:
import NextAuth, { NextAuthOptions } from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; export const authOptions: NextAuthOptions = { session: { strategy: "jwt" }, providers: [ CredentialsProvider({ credentials: { email: { label: "邮箱", type: "email" }, password: { label: "密码", type: "password" }, rememberMe: { label: "记住我", type: "boolean" } }, async authorize(credentials) { // 这里写你的账号验证逻辑,比如查询数据库校验邮箱密码 const user = await yourAuthService.validateUser(credentials?.email, credentials?.password); if (!user) return null; // 将rememberMe和用户信息一起返回,后续传给JWT回调 return { ...user, rememberMe: credentials?.rememberMe }; } }) ], callbacks: { async jwt({ token, user }) { // 登录阶段user存在,把rememberMe存入token if (user) { token.rememberMe = (user as any).rememberMe; // 根据rememberMe设置token过期时间:记住我则15天,否则20秒 token.exp = Math.floor(Date.now() / 1000) + (token.rememberMe ? 15 * 24 * 60 * 60 : 20); } return token; }, async session({ session, token }) { // 同步session的过期时间和token一致 session.maxAge = token.rememberMe ? 15 * 24 * 60 * 60 : 20; session.user = token.user as any; return session; } } }; const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
原写法的问题说明
- 直接在
session.maxAge中使用req.body:NextAuth的配置初始化时机早于请求上下文,无法获取实时请求体;且session.maxAge是全局静态配置,不能根据单个请求动态调整。 - 请求方法为GET:默认
signIn用GET时参数会放在URL query中,没有请求体,强制POST才能在授权回调中拿到rememberMe参数。
内容的提问来源于stack exchange,提问作者Hekmat
相关产品推荐
相关产品推荐

