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
相关产品推荐
相关产品推荐

