Next-Auth v4会话存储JWT Token?Firebase登录后字段缺失
Next-Auth v4 无法获取Firebase认证的id和Token问题解决
问题出在Next-Auth默认只会将标准用户字段(如email)同步到客户端会话,自定义的id和token需要通过jwt和session回调手动配置传递。
修改你的NextAuth配置,添加这两个回调:
import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import { auth } from "@/firebase/config"; // 你的Firebase auth实例路径 import { signInWithEmailAndPassword } from "firebase/auth"; interface MyUser { id: string; email: string | null; token: string; } export const authOptions = { providers: [ CredentialsProvider({ name: 'Credentials', credentials: { email: { label: "Email", type: "text", placeholder: "jsmith@example.com" }, password: { label: "Password", type: "password", placeholder: "*******" } }, async authorize(credentials, req) { if (!credentials?.email || !credentials?.password) return null; try { const userCredential = await signInWithEmailAndPassword( auth, credentials.email, credentials.password, ); const token = await userCredential.user.getIdToken(); // 返回包含必要字段的用户对象 return { id: userCredential.user.uid, email: userCredential.user.email, token: token } as MyUser; } catch (error) { console.log("Invalid credentials.") return null; } } }) ], // 添加JWT回调 callbacks: { async jwt({ token, user }) { // 用户登录时,将authorize返回的自定义字段添加到token if (user) { token.id = user.id; token.token = user.token; } return token; }, // 添加Session回调 async session({ session, token }) { // 将JWT中的自定义字段同步到客户端会话 if (session.user) { session.user.id = token.id as string; session.user.token = token.token as string; } return session; } }, // 可选:开启debug模式排查问题 debug: process.env.NODE_ENV === "development" }; export default NextAuth(authOptions);
关键说明:
jwt回调:在用户首次登录时,user参数就是authorize函数返回的对象,我们把id和token挂载到JWT令牌中。后续请求时,token会被复用,这些字段也会保留。session回调:客户端调用useSession()时,会触发这个回调,我们从JWT令牌中取出id和token,添加到session.user对象里,这样客户端就能获取到这些字段。
现在你在客户端使用useSession()时,就能拿到预期的格式:
const { data: session } = useSession(); console.log(session.user); // 输出:{ id: "xxx", email: "test@gmail.com", token: "ASDasdasFMASFasf123ad" }
内容的提问来源于stack exchange,提问作者Saad Zubairi
相关产品推荐
相关产品推荐

