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

next-auth SignIn突发异常:登录失效后刷新却恢复正常

登录页面调用signIn返回sessionRequired但刷新后自动登录成功(Next 12.0.10 + next-auth 4.1.2)

我用Next 12.0.10和next-auth 4.1.2搭建的登录页面正常运行数月后突然失效。调用signIn后返回{ ok: false, error: "sessionRequired" },触发错误提示,但刷新页面后会自动登录成功并跳转主页,说明Cookie已正确设置,但signIn函数存在异常。

登录提交逻辑

const onSubmit = async ({ email, password }) => {
  try {
    const { ok, error } = await signIn("normal-login", { redirect: false, email: email, password: password, callbackUrl: process.env.LOGIN_CALLBACK_URL})
    console.log('ok, error: ', ok, error)
    if(ok) {
      console.log('Sesión iniciada correctamente')
    } else {
      console.log('error: ', error)
      setCredentialError('Email o contraseña inválidos')
    }
  } catch (error) {
    console.log('error: ', error)
  }
}

[...nextauth].js 配置代码

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"
import { login } from "../axios/auth"
import jwt_decode from "jwt-decode";

export default NextAuth({
  // Configure one or more authentication providers
  providers: [
    CredentialsProvider({
      id: "normal-login",
      name: "normal credentials",
      credentials: {
        email: {
          label: "Email",
          type: "email"
        },
        password: {
          label: "Password",
          type: "password"
        }
      },
      async authorize(credentials) {
        try {
          const res = await login({
            user: {
              email: credentials.email,
              password: credentials.password
            }
          })

          const { token } = res.data
          const token_decoded = jwt_decode(token)

          const user = {
            id: token_decoded.id,
            email: credentials.email,
            name: token_decoded.full_name,
            role: token_decoded.role,
            image: token_decoded.avatar,
            token: token
          }

          return user
        } catch(error) {
          console.log("error: ", error)
        }
        return null
      }
    }),
    CredentialsProvider({
      id: "admin-login",
      name: "admin credentials",
      credentials: {
        username: {
          label: "Email",
          type: "email",
          placeholder: "nombre@test.com"
        },
        password: {
          label: "Password",
          type: "password"
        }
      },
      async authorize(credentials) {
        try {
          const res = await login({
            user: {
              email: credentials.email,
              password: credentials.password
            }
          })
          const { token } = res.data
          const token_decoded = jwt_decode(token)

          const user = {
            id: token_decoded.id,
            email: credentials.email,
            name: token_decoded.full_name,
            role: token_decoded.role,
            image: token_decoded.avatar,
            token: token
          }

          return user
        } catch(error) {
          console.log("error: ", error)
        }
        return null       
      }
    })
    // ...add more providers here
  ],
  callbacks: {
    jwt: ({ token, user }) => {
      // first time jwt callback is run, user object is available

      if (user) {
        token.token = user.token
        token.uid = user.id
      }
      if (user?.role) {
        token.role = user.role
      }
      if (user?.image) {
        token.image = user.image
      }

      return token
    },
    session: ({ session, token }) => {
      // session callback is called whenever a session for that particular user is checked
      if (token) {
        session.token = token.token
        session.user.uid = token.uid
      }
      if (token?.role) {
        session.user.role = token.role
      }
      if (token?.image) {
        session.user.image = token.image
      }
      console.log('session: ', session)
      return session
    },
  },
  session: {
    strategy: "jwt",

    // Seconds - How long until an idle session expires and is no longer valid.
    maxAge: 30 * 24 * 60 * 60, // 30 days
  },
  secret: process.env.NEXTAUTH_SECRET,
  pages: {
    signIn: "/user/login" || "/admin/login"
  }
})

已查阅next-auth相关更新,未找到问题原因,恳请技术帮助。


内容的提问来源于stack exchange,提问作者Alejandra López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:30:59