NextAuth中Credentials登录后useSession无法获取用户信息求助
解决NextAuth Credentials登录后useSession无法获取用户详情的问题
问题核心是Credentials登录流程中,用户信息没有被正确注入到session对象里,按以下步骤排查修复:
1. 检查Credentials Provider的authorize回调
验证用户凭证后,必须返回包含name、email等所需字段的用户对象,否则后续流程无法获取这些信息:
// [...nextauth].js import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; export default NextAuth({ providers: [ CredentialsProvider({ name: "Credentials", credentials: { username: { label: "Username", type: "text" }, password: { label: "Password", type: "password" }, }, async authorize(credentials) { // 替换为你的实际用户验证逻辑(比如从数据库查询) const user = await yourUserModel.findOne({ where: { username: credentials?.username } }); // 验证密码(实际项目请用bcrypt等加密库对比) if (user && credentials?.password === user.password) { // 返回包含核心用户信息的对象 return { id: user.id, name: user.name, email: user.email }; } // 验证失败返回null return null; }, }), // 你的Google Provider配置... ], // 后续回调配置... });
2. 配置jwt和session回调
NextAuth默认通过JWT管理会话,需要确保用户信息被存入JWT并同步到session对象中:
// 在[...nextauth].js的NextAuth配置里添加callbacks callbacks: { async jwt({ token, user }) { // 用户首次登录时,将authorize返回的用户信息存入token if (user) { token.id = user.id; token.name = user.name; token.email = user.email; } return token; }, async session({ session, token }) { // 将token中的用户信息同步到session.user if (token) { session.user.id = token.id; session.user.name = token.name; session.user.email = token.email; } return session; }, },
3. 验证Session结构
在组件中打印session确认字段是否存在,帮助定位问题:
const { data: session } = useSession(); console.log("当前会话信息:", session);
如果Credentials登录后session.user缺少name,优先检查authorize是否返回了该字段,再排查jwt/session回调的赋值逻辑。
4. 确认Session策略配置
NextAuth默认使用jwt会话策略,无需额外修改;如果手动设置了database策略,需确保用户表包含name等字段,且会话表正确关联用户信息。
内容的提问来源于stack exchange,提问作者Eugene Okogun
相关产品推荐
相关产品推荐

