使用NextAuth Credentials登录后Session未返回用户名求助
解决NextAuth CredentialsProvider登录后Session返回空对象的问题
你的问题出在NextAuth默认不会自动将authorize方法返回的用户信息同步到Session中,需要手动配置jwt和session回调来完成这个映射。
修改NextAuth处理器代码
在你的NextAuth配置中添加session和jwt回调配置,具体修改如下:
const handler = NextAuth({ providers: [ CredentialsProvider({ credentials: { username: { label: "Username", type: "text" }, password: { label: "Password", type: "password" } }, async authorize(credentials) { const res = await fetch("http://localhost:3000/api/login", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ username: credentials?.username, password: credentials?.password }), }) const user = await res.json(); if (user) { return user } else { return null } } }), ], // 添加以下配置 session: { strategy: "jwt", // CredentialsProvider必须使用JWT策略存储会话 }, callbacks: { async jwt({ token, user }) { // 用户登录时,将authorize返回的用户信息合并到JWT中 if (user) { token.user = user; } return token; }, async session({ session, token }) { // 将JWT中的用户信息同步到Session对象 session.user = token.user; return session; } } }) export { handler as GET, handler as POST }
配置说明
session.strategy: "jwt":CredentialsProvider不支持数据库会话存储,必须依赖JWT来保存用户身份信息。jwt回调:用户首次登录时,user参数会携带authorize方法返回的用户对象,我们将其存入JWT的token.user字段;后续请求中,该回调会维护JWT的内容。session回调:每次前端调用useSession或获取会话信息时,该回调会把JWT中的用户信息映射到返回的Session对象里,确保你能拿到完整的用户数据。
额外检查点
如果修改后仍有问题,可以排查:
- 登录API返回的用户对象是否包含你需要的字段(如id、username等)
- 在
authorize方法中添加console.log(user),确认用户数据是否正确返回
内容的提问来源于stack exchange,提问作者Quốc Huy Nguyễn
相关产品推荐
相关产品推荐

