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

