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
(將 {project-id}
替換為您的專案 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,
}),
})