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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:32:39