Next.js集成Auth.js后,已认证状态下useSession始终返回空用户对象
Next.js集成Auth.js后,已认证状态下useSession始终返回空用户对象
我之前踩过一模一样的坑!你这个情况大概率是没配置JWT和Session的回调函数,导致Auth.js没法把你在authorize里返回的用户数据持久化到Session中。
先给你说最直接的解决办法,在你的auth.ts配置里加上这部分代码:
export const { handlers, signIn, signOut, auth } = NextAuth({ providers: [ // 你的Credentials provider配置不变 Credentials({ credentials: { email: {}, password: {}, }, authorize: async (credentials) => { let data = { email: credentials.email as string, password: credentials.password as string, } const user = await AuthService.login(data) console.log('the user', user) return user }, }), ], // 新增以下配置 session: { strategy: "jwt", // 显式指定session策略为JWT,默认也是这个,但显式写更清晰 }, callbacks: { // 登录时把用户数据合并到JWT Token里 async jwt({ token, user }) { if (user) { // 把你的user对象整个存到token里,或者按需挑字段存 token.user = user; } return token; }, // 从JWT Token里取出用户数据,放到Session中 async session({ session, token }) { session.user = token.user as any; return session; }, }, })
为什么要加这个?因为用Credentials Provider的时候,Auth.js不会自动把你在authorize里返回的用户数据同步到Session里。你登录时authorize里的user有数据,但后续请求Auth.js不知道从哪里获取这个用户信息,只能告诉你“已经认证了”,但用户数据是空的。
除了加回调,你还要检查这两个点:
- 确保你的
AuthService.login返回的user是一个可序列化的普通对象,不能包含函数、Symbol这类没法转成JSON的内容,不然存到JWT的时候会被自动忽略,导致Session里拿不到。 - 确认你的
SessionProvider已经正确包裹了整个应用(比如在layout.tsx或者_app.tsx里),useSession必须在这个Provider的范围内使用,不然也会拿不到正确的Session数据。
举个正确的Provider配置例子:
// app/layout.tsx import { SessionProvider } from "next-auth/react"; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="zh-CN"> <body> <SessionProvider>{children}</SessionProvider> </body> </html> ); }
按照这个改完之后,你再用useSession获取的session.user应该就能拿到完整的用户数据了!
备注:内容来源于stack exchange,提问作者ahols
相关产品推荐
相关产品推荐

