서버에 Firebase Admin SDK 추가

Admin SDK를 사용하면 관리자 권한 환경에서 Firebase와 상호 작용하여 다음과 같은 작업을 수행할 수 있습니다.

  • 전체 관리자 권한으로 실시간 데이터베이스 데이터를 읽고 씁니다.
  • FCM 서버 프로토콜에 대한 간단한 대안적인 접근법을 사용하여 프로그래매틱 방식으로 Firebase 클라우드 메시징 메시지를 전송합니다.
  • Firebase 인증 토큰을 생성하고 검증합니다.
  • Cloud Storage 버킷과 같은 Google Cloud Platform 리소스 및 Firebase 프로젝트에 연결된 Firestore 데이터베이스에 액세스합니다.
  • 간소화된 관리자 콘솔을 직접 만들어 인증을 위해 사용자 데이터 조회, 사용자의 이메일 주소 변경과 같은 작업을 수행합니다.

서버와 같은 관리자 권한 환경에서 액세스를 관리하지 않고 최종 사용자의 액세스를 위한 클라이언트로 Node.js SDK를 사용하려는 경우(예: Node.js 데스크톱 또는 IoT 애플리케이션) 클라이언트 자바스크립트 SDK 설정 안내를 따라야 합니다.

다음은 각 언어에서 지원되는 Firebase 기능을 보여주는 표입니다.

기능 Node.js 자바 Python Go C#
맞춤 토큰 발급
ID 토큰 검증
사용자 관리
맞춤 클레임으로 액세스 제어
토큰 취소 새로고침
사용자 가져오기
세션 쿠키 관리
이메일 작업 링크 생성
실시간 데이터베이스 *
클라우드 메시징
FCM 주제 구독 관리
Cloud Storage
Cloud Firestore
프로젝트 관리

이러한 용도의 Admin SDK 통합에 관한 자세한 내용은 해당 실시간 데이터베이스, FCM, 인증, Cloud Storage 문서를 참조하세요. 이 페이지의 나머지 부분에서는 기본적인 Admin SDK 설정 방법을 보여줍니다.

기본 요건

시작하기 전에 다음과 같은 항목이 필요합니다.

  • Admin Node.js SDK를 사용하는 경우 Node.js 6.0 이상을 실행하는 서버
  • Admin 자바 SDK를 사용하는 경우 자바 7 이상을 실행하는 서버
  • Admin Python SDK를 사용하는 경우 Python 2.7 이상 또는 3.4 이상을 실행하는 서버
  • Admin Go SDK를 사용하는 경우 Go 1.9 이상을 실행하는 서버
  • Admin .NET SDK를 사용하는 경우 .NET Framework 4.5 이상 또는 .Net Core 1.5 이상을 실행하는 서버
  • 서버 앱

앱에 Firebase 추가

Firebase Admin SDK를 사용하려면 Firebase 프로젝트, Firebase 서비스와 통신할 서비스 계정 및 서비스 계정의 사용자 인증 정보를 포함하는 구성 파일이 필요합니다.

  1. Firebase 프로젝트가 없으면 Firebase 콘솔에서 추가합니다. 프로젝트 추가 대화상자로도 기존 Google Cloud Platform 프로젝트에 Firebase를 추가할 수 있습니다.
  2. 프로젝트의 설정 페이지에서 서비스 계정 탭으로 이동합니다.
  3. 서비스 계정 탭의 Firebase Admin SDK 섹션 하단에 있는 새 비공개 키 생성 버튼을 클릭합니다.

버튼을 클릭하면 서비스 계정의 사용자 인증 정보를 포함하는 JSON 파일이 다운로드됩니다. 다음 단계에서 이 파일이 있어야 SDK를 초기화할 수 있습니다.

이 파일은 한번만 생성됩니다. 키가 분실되거나 유출될 경우 위에서 안내한 방법을 다시 실행하여 서비스 계정의 JSON 키를 새로 만들 수 있습니다.

SDK 추가

새 프로젝트를 설정할 때는 원하는 언어의 SDK를 설치해야 합니다.

Node.js

Firebase Admin Node.js SDK는 npm으로 제공됩니다. package.json 파일이 아직 없다면 npm init로 파일을 만듭니다. 그런 다음 firebase-admin npm 패키지를 설치하고 package.json에 저장합니다.

$ npm install firebase-admin --save

애플리케이션에서 모듈을 사용하려면 자바스크립트 파일에서 require로 가져옵니다.

var admin = require('firebase-admin');

ES2015를 사용하는 경우 import로 모듈을 가져올 수 있습니다.

import * as admin from 'firebase-admin';

자바

Firebase Admin 자바 SDK는 Maven 중앙 저장소에 게시되어 있습니다. 라이브러리를 설치하려면 build.gradle 파일에 종속 항목으로 선언합니다.

dependencies {
  implementation 'com.google.firebase:firebase-admin:6.7.0'
}

Maven을 사용하여 애플리케이션을 빌드하는 경우 pom.xml에 다음과 같은 종속 항목을 추가할 수 있습니다.

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>6.7.0</version>
</dependency>

Python

Firebase Admin Python SDK는 pip를 통해 제공됩니다. sudo를 통해 모든 사용자용으로 라이브러리를 설치할 수 있습니다.

$ sudo pip install firebase-admin

또는 --user 플래그를 전달하여 현재 사용자용으로만 라이브러리를 설치할 수 있습니다.

$ pip install --user firebase-admin

Go

Go Admin SDK는 go get 유틸리티를 사용하여 설치할 수 있습니다.

$ go get firebase.google.com/go

C#

.NET Admin SDK는 .NET 패키지 관리자를 사용하여 설치할 수 있습니다.

$ Install-Package FirebaseAdmin -Version 1.0.0

또는 dotnet 명령줄 유틸리티를 사용하여 설치합니다.

$ dotnet add package FirebaseAdmin --version 1.0.0

또는 .csproj 파일에 다음 패키지 참조 항목을 추가하여 설치할 수 있습니다.

<ItemGroup>
  <PackageReference Include="FirebaseAdmin" Version="1.0.0" />
</ItemGroup>

SDK 초기화

Firebase 콘솔 프로젝트를 만들고 서비스 계정 사용자 인증 정보가 포함된 JSON 파일을 다운로드했으면 다음 코드로 SDK를 초기화할 수 있습니다.

Node.js

var admin = require('firebase-admin');

var serviceAccount = require('path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

자바

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

import firebase_admin
from firebase_admin import credentials

cred = credentials.Certificate('path/to/serviceAccountKey.json')
default_app = firebase_admin.initialize_app(cred)

Google App Engine 표준 환경에서 Python Admin SDK를 사용하려면 몇 가지 추가 구성이 필요합니다.

Go

import (
	"context"
	"log"

	firebase "firebase.google.com/go"
	"firebase.google.com/go/auth"
	"google.golang.org/api/option"
)

opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

using FirebaseAdmin;
using FirebaseAdmin.Auth;
using Google.Apis.Auth.OAuth2;


FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromFile("path/to/serviceAccountKey.json"),
});

Firebase 콘솔 프로젝트의 데이터베이스 페이지에서 데이터베이스 이름을 확인할 수 있습니다.

서비스 계정 파일을 참조할 수 없는 경우 Admin Node.js SDK는 서비스 계정의 개별 인라인 필드를 취할 수 있습니다.

Node.js

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: '<PROJECT_ID>',
    clientEmail: 'foo@<PROJECT_ID>.iam.gserviceaccount.com',
    privateKey: '-----BEGIN PRIVATE KEY-----\n<KEY>\n-----END PRIVATE KEY-----\n'
  }),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

다른 인증 정보 유형을 사용하여 Admin SDK를 인증할 수도 있습니다. 예를 들어 Google Cloud Platform 내에서 코드를 실행하는 경우 Google 애플리케이션 기본 사용자 인증 정보를 사용하면 Admin SDK에서 서비스 계정을 가져옵니다.

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

자바

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

Google Compute Engine VM과 Google 애플리케이션 기본 사용자 인증 정보를 실시간 데이터베이스 또는 인증에 사용하는 경우 액세스 범위를 올바르게 설정해야 합니다. 실시간 데이터베이스 또는 인증의 경우 userinfo.emailcloud-platform 또는 firebase.database에 범위 끝이 필요합니다. 기존 액세스 범위를 확인하고 변경하려면 gcloud를 사용하여 다음 명령을 실행합니다.

gcloud

# Check the existing access scopes
gcloud compute instances describe [INSTANCE_NAME] --format json

# The above command returns the service account information. For example:
  "serviceAccounts": [
   {
    "email": "your.gserviceaccount.com",
    "scopes": [
     "https://www.googleapis.com/auth/cloud-platform",
     "https://www.googleapis.com/auth/userinfo.email"
     ]
    }
  ],

# Stop the VM, then run the following command, using the service account
# that gcloud returned when you checked the scopes.

gcloud compute instances set-service-account [INSTANCE_NAME] --service-account "your.gserviceaccount.com" --scopes "https://www.googleapis.com/auth/firebase.database,https://www.googleapis.com/auth/userinfo.email"

Admin SDK는 Google OAuth2 새로고침 토큰으로 인증할 수 있는 인증 정보도 제공합니다.

Node.js

var refreshToken; // Get refresh token from OAuth2 flow

admin.initializeApp({
  credential: admin.credential.refreshToken(refreshToken),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

자바

FileInputStream refreshToken = new FileInputStream("path/to/refreshToken.json");

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(refreshToken))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

cred = credentials.RefreshToken('path/to/refreshToken.json')
default_app = firebase_admin.initialize_app(cred)

Go

opt := option.WithCredentialsFile("path/to/refreshToken.json")
config := &firebase.Config{ProjectID: "my-project-id"}
app, err := firebase.NewApp(context.Background(), config, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromFile("path/to/refreshToken.json"),
});

매개변수 없이 SDK를 초기화할 수도 있습니다. 이 경우 SDK는 Google 애플리케이션 기본 사용자 인증 정보를 사용하고 FIREBASE_CONFIG 환경 변수에서 옵션을 읽습니다. FIREBASE_CONFIG 변수의 내용이 {로 시작되면 JSON 객체로 파싱됩니다. 그렇지 않으면 SDK에서 문자열이 옵션을 포함하는 JSON 파일의 이름이라고 가정합니다.

Node.js

// Initialize the default app
var admin = require('firebase-admin');
var app = admin.initializeApp();

자바

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create();

이제 Firebase Admin SDK를 사용하여 다음 작업을 수행할 준비가 되었습니다.

여러 앱 초기화

대부분의 경우에는 기본 앱 하나만 초기화하면 됩니다. 이 앱을 통해 서로 동일한 두 가지 방법으로 서비스에 액세스할 수 있습니다.

Node.js

// Initialize the default app
var defaultApp = admin.initializeApp(defaultAppConfig);

console.log(defaultApp.name);  // '[DEFAULT]'

// Retrieve services via the defaultApp variable...
var defaultAuth = defaultApp.auth();
var defaultDatabase = defaultApp.database();

// ... or use the equivalent shorthand notation
defaultAuth = admin.auth();
defaultDatabase = admin.database();

자바

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

System.out.println(defaultApp.getName());  // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
FirebaseAuth defaultAuth = FirebaseAuth.getInstance(defaultApp);
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.getInstance();
defaultDatabase = FirebaseDatabase.getInstance();

Python

# Import the Firebase service
from firebase_admin import auth

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)
print(default_app.name)  # "[DEFAULT]"

# Retrieve services via the auth package...
# auth.create_custom_token(...)

Go

// Initialize default app
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access auth service from the default app
client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C#

// Initialize the default app
var defaultApp = FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
var defaultAuth = FirebaseAuth.GetAuth(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.DefaultInstance;

사용 사례에 따라서는 여러 앱을 동시에 만들어야 할 수 있습니다. 예를 들어 Firebase 프로젝트 중 하나의 실시간 데이터베이스에서 데이터를 읽고 다른 프로젝트에는 맞춤 토큰을 발급해야 할 수 있습니다. 또는 두 앱을 서로 다른 인증 정보로 인증해야 할 수 있습니다. Firebase SDK로 각각 고유한 구성 정보를 사용하여 여러 앱을 동시에 만들 수 있습니다.

Node.js

// Initialize the default app
admin.initializeApp(defaultAppConfig);

// Initialize another app with a different config
var otherApp = admin.initializeApp(otherAppConfig, 'other');

console.log(admin.app().name);  // '[DEFAULT]'
console.log(otherApp.name);     // 'other'

// Use the shorthand notation to retrieve the default app's services
var defaultAuth = admin.auth();
var defaultDatabase = admin.database();

// Use the otherApp variable to retrieve the other app's services
var otherAuth = otherApp.auth();
var otherDatabase = otherApp.database();

자바

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

// Initialize another app with a different config
FirebaseApp otherApp = FirebaseApp.initializeApp(otherAppConfig, "other");

System.out.println(defaultApp.getName());  // "[DEFAULT]"
System.out.println(otherApp.getName());    // "other"

// Use the shorthand notation to retrieve the default app's services
FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance();

// Use the otherApp variable to retrieve the other app's services
FirebaseAuth otherAuth = FirebaseAuth.getInstance(otherApp);
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Python

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)

#  Initialize another app with a different config
other_app = firebase_admin.initialize_app(cred, name='other')

print(default_app.name)    # "[DEFAULT]"
print(other_app.name)      # "other"

# Retrieve default services via the auth package...
# auth.create_custom_token(...)

# Use the `app` argument to retrieve the other app's services
# auth.create_custom_token(..., app=other_app)

Go

// Initialize the default app
defaultApp, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Initialize another app with a different config
opt := option.WithCredentialsFile("service-account-other.json")
otherApp, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access Auth service from default app
defaultClient, err := defaultApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

// Access auth service from other app
otherClient, err := otherApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C#

// Initialize the default app
var defaultApp = FirebaseApp.Create(defaultOptions);

// Initialize another app with a different config
var otherApp = FirebaseApp.Create(otherAppConfig, "other");

Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
Console.WriteLine(otherApp.Name); // "other"

// Use the shorthand notation to retrieve the default app's services
var defaultAuth = FirebaseAuth.DefaultInstance;

// Use the otherApp variable to retrieve the other app's services
var otherAuth = FirebaseAuth.GetAuth(otherApp);

다음 단계

Firebase 알아보기:

앱에 Firebase 기능 추가:

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.