Firebase 어댑터
Firebase Admin SDK와 Firestore를 사용합니다.
리소스
설정
설치
npm install @auth/firebase-adapter firebase-admin
환경 변수
// 서비스 계정 파일을 통한 인증
GOOGLE_APPLICATION_CREDENTIALS
// 키 값으로 인증
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,
}),
})