Admin SDK 설치

이 문서에서는 Identity Platform Admin SDK를 설치하는 방법을 설명합니다. Admin SDK를 사용하면 서버 환경에서 Identity Platform을 관리하고 사용자 마이그레이션, 커스텀 클레임 설정, ID 공급업체 구성과 같은 관리자 작업을 수행할 수 있습니다.

시작하기 전에

Admin SDK를 사용하려면 다음 중 하나를 실행하는 서버 앱이 필요합니다.

언어 최소 프레임워크 버전
Node.js Node.js 8.13.0 이상
자바 자바 7 이상(자바 8 이상 권장)
Python Python 2.7 이상 또는 3.4 이상(3.4 이상 권장)
Go Go 1.9 이상
C# .NET Framework 4.5 이상 또는 .NET Core 1.5 이상

다음 표에는 각 SDK 언어에서 지원되는 기능이 나와 있습니다.

기능 Node.js 자바 Python Go C#
커스텀 토큰 발급
ID 토큰 확인
사용자 관리
커스텀 클레임으로 액세스 제어
갱신 토큰 취소
사용자 가져오기
세션 쿠키 관리
이메일 작업 링크 생성
SAML 및 OIDC 공급업체 구성 관리
멀티테넌시 지원

또한 프로젝트의 서비스 계정과 키가 필요합니다.

Cloud Console

서비스 계정을 만듭니다.

  1. Cloud Console에서 서비스 계정 만들기 페이지로 이동합니다.

    서비스 계정 만들기로 이동
  2. 프로젝트를 선택합니다.
  3. 서비스 계정 이름 필드에 이름을 입력합니다. Cloud Console은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

    서비스 계정 설명 필드에 설명을 입력합니다. 예를 들면 Service account for quickstart입니다.

  4. 만들기를 클릭합니다.
  5. 역할 선택 필드를 클릭합니다.

    빠른 액세스에서 기본을 클릭한 후 소유자를 클릭합니다.

  6. 계속을 클릭합니다.
  7. 완료를 클릭하여 서비스 계정 만들기를 마칩니다.

    브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.

서비스 계정 키 만들기

  1. Cloud Console에서 만든 서비스 계정의 이메일 주소를 클릭합니다.
  2. 를 클릭합니다.
  3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
  4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.
  5. 닫기를 클릭합니다.

명령줄

로컬 머신 또는 Cloud Shell에서 Cloud SDK를 사용하여 다음 명령어를 실행할 수 있습니다.

  1. 서비스 계정을 만듭니다. NAME을 서비스 계정 이름으로 바꿉니다.

    gcloud iam service-accounts create NAME
  2. 서비스 계정에 권한을 부여합니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

    gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:NAME@PROJECT_ID.iam.gserviceaccount.com" --role="roles/owner"
  3. 키 파일을 생성합니다. FILE_NAME을 키 파일 이름으로 바꿉니다.

    gcloud iam service-accounts keys create FILE_NAME.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com

GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정하여 애플리케이션 코드에 사용자 인증 정보를 제공합니다. 이 변수는 현재 셸 세션에만 적용되므로 새 세션을 연 경우 변수를 다시 설정합니다.

Linux 또는 macOS

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

KEY_PATH를 서비스 계정 키가 포함된 JSON 파일의 경로로 바꿉니다.

예를 들면 다음과 같습니다.

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

KEY_PATH를 서비스 계정 키가 포함된 JSON 파일의 경로로 바꿉니다.

예를 들면 다음과 같습니다.

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

명령어 프롬프트:

set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH

KEY_PATH를 서비스 계정 키가 포함된 JSON 파일의 경로로 바꿉니다.

SDK 설치

Node.js

Node.js Admin SDK는 npm에서 사용할 수 있습니다. 아직 package.json 파일이 없으면 npm init를 사용하여 파일을 만듭니다. 다음으로 npm 패키지를 설치하고 package.json에 저장합니다.

npm install firebase-admin --save

앱에서 모듈을 사용하려면 자바스크립트 파일에서 require합니다.

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

ES2015를 사용하는 경우 대신 모듈을 import할 수 있습니다.

import * as admin from 'firebase-admin';

자바

자바 Admin SDK가 Maven Central Repository에 게시됩니다. 라이브러리를 설치하려면 build.gradle 파일에서 종속 항목으로 선언합니다.

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

Maven을 사용하여 앱을 빌드하는 경우 pom.xml에 다음 종속 항목을 추가할 수 있습니다.

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

Python

Python Admin SDK는 pip를 통해 제공됩니다.

pip install --user firebase-admin

Go

go get 유틸리티를 사용하여 Go Admin SDK를 설치합니다.

go get firebase.google.com/go

C#

.NET 패키지 관리자를 사용하여 .NET Admin SDK를 설치합니다.

Install-Package FirebaseAdmin -Version 1.9.1

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

dotnet add package FirebaseAdmin --version 1.9.1

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

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

기본 사용자 인증 정보를 사용하여 SDK 초기화

서버 앱에 다음 코드를 추가하여 기본 사용자 인증 정보를 사용해 Admin SDK를 초기화합니다.

Node.js

// Initialize the default app
var admin = require('firebase-admin');
var app = admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

자바

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();

서비스 계정 키 파일로 SDK 초기화

서비스 계정 키 파일을 수동으로 지정할 수도 있습니다.

Node.js

// Initialize the default app
var admin = require('firebase-admin');
var app = admin.initializeApp({
  credential: admin.credential.cert('/path/to/serviceAccountKey.json')
});

자바

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

FirebaseOptions options = 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
from firebase_admin import exceptions

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

Go

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#

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

여러 앱 초기화

일반적으로 단일 기본 앱만 초기화하는 것이 좋습니다. 그러나 구성 옵션과 인증 상태가 각기 다른 여러 개의 앱 인스턴스를 만들 수도 있습니다.

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();

자바

// 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);

범위 설정

인증에 Google 애플리케이션 기본 사용자 인증 정보와 함께 Compute Engine VM을 사용하는 경우 올바른 액세스 범위를 설정해야 합니다. Identity Platform에는 userinfo.emailcloud-platform 액세스 범위가 필요합니다.

기존 액세스 범위를 확인하려면 다음을 실행합니다.

gcloud compute instances describe [INSTANCE-NAME] --format json

이 명령어는 서비스 계정에 대한 정보를 반환합니다. 예를 들면 다음과 같습니다.

"serviceAccounts": [
 {
  "email": "example.gserviceaccount.com",
  "scopes": [
   "https://www.googleapis.com/auth/cloud-platform",
   "https://www.googleapis.com/auth/userinfo.email"
   ]
  }
]

액세스 범위를 업데이트하려면 VM을 중지한 후 다음을 실행합니다.


gcloud compute instances set-service-account [INSTANCE-NAME] \
  --service-account "your.gserviceaccount.com" \
  --scopes ""https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email"

다음 단계