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プロジェクトを作成し、サービスアカウントキーを生成します。次のURLにアクセスしてください: 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,
}),
})