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

NextAuth结合Google Provider与Firebase未生成Firebase Auth用户问题

问题描述

已在api/auth/[...nextauth].js中完成NextAuth与Firebase的配置,代码如下:

import {FirestoreAdapter} from "@auth/firebase-adapter"
import {cert} from "firebase-admin/app"
import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"
export const authOptions = {
  // Configure one or more authentication providers
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }
    ),
  ],
  adapter: FirestoreAdapter({
    credential: cert({
      projectId: process.env.FIREBASE_PROJECT_ID,
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
      privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')
    })
  })
}

export default NextAuth(authOptions)

已添加所有相关环境变量(包括Google的配置项)。客户端使用如下signIn函数实现登录:

<button onClick={() => signIn('google')}>
    <FcGoogle className=" w-10 h-10" />
</button>

点击按钮后可成功登录,Firestore中已创建users、sessions、accounts集合,但Firebase Authentication中无用户记录。


原因分析

当前使用的@auth/firebase-adapter仅负责将NextAuth的用户、会话数据同步到Firestore数据库,它和Firebase Authentication是Firebase生态中完全独立的两个组件:

  • NextAuth通过Firestore Adapter完成自身的用户数据存储,属于NextAuth的用户管理逻辑;
  • Firebase Authentication是独立的身份认证服务,需要主动调用其API才能创建用户记录,Adapter不会自动触发这个操作。

解决方法

要让用户同时出现在Firebase Authentication中,需要在NextAuth的登录流程中添加自定义逻辑,调用Firebase Admin SDK创建用户。

1. 安装Firebase Admin SDK(未安装则执行)

npm install firebase-admin

2. 修改api/auth/[...nextauth].js配置

在NextAuth的callbacks中添加signIn回调,在用户首次登录时创建Firebase Auth用户:

import {FirestoreAdapter} from "@auth/firebase-adapter"
import {cert} from "firebase-admin/app"
import {getAuth as getAdminAuth} from "firebase-admin/auth"
import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"

// 初始化Firebase Admin实例
const adminCredential = cert({
  projectId: process.env.FIREBASE_PROJECT_ID,
  clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
  privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')
})
const adminAuth = getAdminAuth(adminCredential)

export const authOptions = {
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
  adapter: FirestoreAdapter({ credential: adminCredential }),
  callbacks: {
    async signIn({ user, account }) {
      // 仅处理Google登录场景
      if (account.provider === "google") {
        try {
          // 检查Firebase Auth中是否已存在该用户
          await adminAuth.getUserByEmail(user.email)
        } catch (error) {
          // 用户不存在时,创建Firebase Auth用户
          if (error.code === "auth/user-not-found") {
            await adminAuth.createUser({
              email: user.email,
              emailVerified: user.emailVerified,
              displayName: user.name,
              photoURL: user.image,
              uid: user.id // 可选:用NextAuth的用户ID作为Firebase Auth的UID
            })
          } else {
            // 抛出其他未知错误
            throw error
          }
        }
      }
      return true
    }
  }
}

export default NextAuth(authOptions)

3. 验证效果

重启项目后使用Google登录,Firebase Authentication控制台会同步生成用户记录,同时Firestore的相关集合仍会正常维护。


内容的提问来源于stack exchange,提问作者WaLid LamRaoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:27:19