Next.js登录成功后Session返回Null的问题排查求助
问题排查与解决方案
核心问题1:JWT回调未正确存储用户数据
你的jwt回调逻辑完全没有处理登录时传入的user对象,导致token中没有存储用户的id、jwt、roles等关键信息,后续session回调自然无法从token中读取到这些数据,最终返回的session为空。
修复后的JWT回调代码
callbacks: { jwt: ({ token, user }:{token:any,user:any}) => { // 登录成功时,user是authorize返回的用户对象,需要把它的属性合并到token中 if (user) { token.id = user.id; token.roles = user.roles; token.jwt = user.jwt; token.name = user.name; } // 后续请求时,直接返回已存储数据的token return token; }, session: ({ session, token }:{session:any,token:any}) => { session.user.id = token.id; session.user.roles = token.roles; session.user.jwt = token.jwt; session.user.name = token.name; return session; }, },
核心问题2:Login组件中Session的获取与时机问题
你在onSubmit中直接打印session,如果这个session不是通过useSession()钩子获取的,或者刚完成signIn就立即读取,可能会因为session还未完成更新而显示null。
修复后的Login组件处理逻辑
确保通过NextAuth的useSession钩子获取session,并且可以通过监听session状态变化来处理页面跳转:
import { useSession, signIn } from "next-auth/react"; import { useRouter } from "next/navigation"; // ...其他代码 const { data: session, status } = useSession(); const router = useRouter(); const onSubmit: SubmitHandler<IFormValues> = async (data) => { const signedIn = await signIn("credentials", { username: data?.userName, password: data?.password, redirect: false, callbackUrl, }); if (signedIn?.error) { // 处理登录错误 console.error("登录失败:", signedIn.error); return; } // 登录成功后,等待session更新再跳转 const checkSessionInterval = setInterval(() => { if (session) { clearInterval(checkSessionInterval); router.push("/profile"); } }, 100); };
额外检查点
- 确保你的
.env文件中配置了NEXTAUTH_SECRET,NextAuth需要这个密钥来加密session数据,缺失会导致session无法正常存储:NEXTAUTH_SECRET=your-secret-key-here - 检查Strapi返回的
user对象是否包含first_name和last_name,如果某个字段为空,name可能会变成无效值,影响session的正常生成。
内容的提问来源于stack exchange,提问作者Zia Yamin
相关产品推荐
相关产品推荐

