Firebase 适配器
使用 Firebase Admin SDK 和 Firestore.
资源
设置
安装
npm install @auth/firebase-adapter firebase-admin
环境变量
// Auth via Service Account File
GOOGLE_APPLICATION_CREDENTIALS
// Auth via key values
AUTH_FIREBASE_PROJECT_ID
AUTH_FIREBASE_CLIENT_EMAIL
AUTH_FIREBASE_PRIVATE_KEY
配置
auth.ts
import NextAuth from "next-auth"
import { FirestoreAdapter } from "@auth/firebase-adapter"
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [],
adapter: FirestoreAdapter(),
})
身份验证
服务帐号文件
首先,创建一个 Firebase 项目并生成一个服务帐号密钥。访问:https://console.firebase.google.com/u/0/project/{project-id}/settings/serviceaccounts/adminsdk
(用您的项目的 ID 替换 {project-id}
)
- 下载服务帐号密钥并将其保存在您的项目中。(确保将文件添加到您的
.gitignore
中!) - 将
GOOGLE_APPLICATION_CREDENTIALS
添加到您的环境变量中,并将其指向服务帐号密钥文件。 - 适配器将自动获取环境变量并使用它来验证 Firebase Admin SDK。您不需要向适配器传递任何额外的身份验证选项。
服务帐号值
- 将服务帐号密钥下载到临时位置(不要提交此文件!)。
- 将以下环境变量添加到您的项目中
a.AUTH_FIREBASE_PROJECT_ID
b.AUTH_FIREBASE_CLIENT_EMAIL
c.AUTH_FIREBASE_PRIVATE_KEY
./auth.ts
import NextAuth from "next-auth"
import { FirestoreAdapter } from "@auth/firebase-adapter"
import { cert } from "firebase-admin/app"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: FirestoreAdapter({
credential: cert({
projectId: process.env.AUTH_FIREBASE_PROJECT_ID,
clientEmail: process.env.AUTH_FIREBASE_CLIENT_EMAIL,
privateKey: process.env.AUTH_FIREBASE_PRIVATE_KEY,
}),
}),
})
使用现有的 Firestore 实例
如果您已经拥有 Firestore 实例,则可以直接将该实例传递给适配器。
💡
在传递实例并在无服务器环境中时,请记住处理重复的应用程序初始化。
您可以使用 initFirestore
实用程序来安全地初始化应用程序并获取实例。
./auth.ts
import NextAuth from "next-auth"
import { FirestoreAdapter } from "@auth/firebase-adapter"
import { firestore } from "lib/firestore"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: FirestoreAdapter(firestore),
})
一个实用程序函数,有助于确保在无服务器环境中不会出现重复的应用程序初始化问题。如果未传递任何参数,它将使用 GOOGLE_APPLICATION_CREDENTIALS
环境变量来初始化 Firestore 实例。
lib/firestore.ts
import { initFirestore } from "@auth/firebase-adapter"
import { cert } from "firebase-admin/app"
export const firestore = initFirestore({
credential: cert({
projectId: process.env.FIREBASE_PROJECT_ID,
clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
privateKey: process.env.FIREBASE_PRIVATE_KEY,
}),
})