You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:50:12