サーバーに Firebase Admin SDK を追加する

Admin SDK は、特権環境から Firebase を操作するために使用するサーバー ライブラリのセットであり、次のような操作を行うことができます。

  • Realtime Database のデータの読み取りと書き込みを完全な管理者権限で実行する。
  • Firebase Cloud Messaging サーバー プロトコルへの簡単な代替アプローチを使用して、プログラムにより Firebase Cloud Messaging メッセージを送信する。
  • Firebase Auth トークンを生成し確認する。
  • Google Cloud リソース(Cloud Storage バケットや、Firebase プロジェクトに関連付けられた Cloud Firestore データベースなど)にアクセスする。
  • 独自の簡単な管理コンソールを作成して、認証のためにユーザーデータの検索やユーザーのメールアドレス変更などの作業を行う。

特権環境(サーバーなど)からの管理者アクセスではなく、エンドユーザー アクセスのクライアントとして Node.js SDK を使用することを検討している場合(Node.js デスクトップ、IoT アプリケーションなど)、このドキュメントではなく、クライアント JavaScript SDK の設定に関する手順をご覧ください。

以下に、各言語でサポートされている Firebase 機能を示す機能マトリックスを示します。

機能 Node.js Java Python Go C#
カスタム トークンの作成
ID トークンの確認
ユーザー管理
カスタム クレームでアクセスを制御する
更新トークンを取り消す
ユーザーをインポートする
セッション Cookie を管理する
メールのアクション リンクを生成する
SAML / OIDC プロバイダの構成を管理する
マルチテナンシーのサポート
Realtime Database *
Firebase Cloud Messaging
FCM マルチキャスト
FCM トピックのサブスクリプションの管理
Cloud Storage
Cloud Firestore
プロジェクト管理
セキュリティ ルール
ML モデルの管理
Firebase Remote Config
Firebase App Check
Firebase Extensions

この用途で Admin SDK を統合する方法については、対応する Realtime DatabaseFCMAuthenticationRemote ConfigCloud Storage のドキュメントをご覧ください。このページの残りの部分では、Admin SDK の基本的なセットアップに焦点を当てます。

前提条件

  • サーバーアプリがインストールされていることを確認します。

  • 使用する Admin SDK に応じて、サーバーで以下が実行できるか確認してください。

    • Admin Node.js SDK - Node.js 14 以降(Node.js 16 以降を推奨)
      Node.js 14 のサポートは非推奨になりました。
    • Admin Java SDK - Java 8 以降
    • Admin Python SDK - Python 3.7 以降(Python 3.8 以降を推奨)
      Python 3.7 のサポートは非推奨になりました。
    • Admin Go SDK - Go 1.17 以降
    • Admin .NET SDK - .NET Framework 4.6.1 以降、または .Net Core 2.0 以降用 NET Standard 2.0

Firebase プロジェクトとサービス アカウントの設定

Firebase Admin SDK を使用するには、次のものが必要です。

  • Firebase プロジェクト
  • Firebase と通信する Firebase Admin SDK サービス アカウント。このサービス アカウントは、Firebase プロジェクトを作成するか、Google Cloud プロジェクトに Firebase を追加すると、自動的に作成されます。
  • サービス アカウントの認証情報を含む構成ファイル。

Firebase プロジェクトをまだ作成していない場合は、Firebase コンソールでプロジェクトを作成する必要があります。Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。

SDK を追加する

新しいプロジェクトを設定する場合は、選択した言語の SDK をインストールする必要があります。

Node.js

Firebase Admin Node.js SDK は npm で利用可能です。まだ package.json ファイルがない場合は、npm init で作成します。次に、firebase-admin npm パッケージをインストールして package.json に保存します。

npm install firebase-admin --save

アプリケーションでモジュールを使用するには、任意の JavaScript ファイルから次のようにモジュールを require します。

const { initializeApp } = require('firebase-admin/app');

あるいは ES2015 を使用している場合は、次のようにモジュールを import できます。

import { initializeApp } from 'firebase-admin/app';

Java

Firebase Admin Java SDK は Maven 中央リポジトリに公開されます。ライブラリをインストールするには、build.gradle ファイルで依存関係として宣言します。

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

Maven を使用してアプリケーションをビルドしている場合は、pom.xml に次の依存関係を追加できます。

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>9.2.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 install ユーティリティを使用してインストールできます。

# Install the latest version:
go install firebase.google.com/go/v4@latest

# Or install a specific version:
go install firebase.google.com/go/v4@4.13.0

C#

.NET Admin SDK は、.NET package manager を使用してインストールできます。

Install-Package FirebaseAdmin -Version 2.4.0

または、dotnet コマンドライン ユーティリティを使用してインストールします。

dotnet add package FirebaseAdmin --version 2.4.0

または、次のパッケージ参照エントリを .csproj ファイルに追加してインストールできます。

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

SDK を初期化する

Firebase プロジェクトを作成したら、Google アプリケーションのデフォルト認証情報を使用して SDK を初期化できます。デフォルト認証情報の検索は Google 環境で完全に自動化されており、環境変数やその他の構成を指定する必要がないため、Cloud Run、App Engine、Cloud Functions などの Google 環境で実行されるアプリケーションでは、この方法で SDK を初期化することを強くおすすめします。

Realtime Database、Cloud Storage、Cloud Functions などのサービスの初期化オプションを指定する場合は、FIREBASE_CONFIG 環境変数を使用します。FIREBASE_CONFIG 変数は、そこに格納されている値が { で始まる場合、JSON オブジェクトとして解析されます。それ以外の場合、SDK は文字列がオプションを含む JSON ファイルのパスであるとみなします。

Node.js

const app = initializeApp();

Java

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

初期化後は、Admin SDK を使用して次のタスクを行うことができます。

OAuth 2.0 更新トークンを使用する

また、次に示すように、Google OAuth2 更新トークンを使った認証を可能にする認証情報も Admin SDK に備わっています。

Node.js

const myRefreshToken = '...'; // Get refresh token from OAuth2 flow

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

Java

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

FirebaseOptions options = 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"),
});

Google 以外の環境で SDK を初期化する

デフォルトの認証情報の検索を完全に自動化できない Google 以外のサーバー環境で作業している場合は、エクスポートしたサービス アカウント キー ファイルを使用して SDK を初期化できます。

Firebase プロジェクトでは Google サービス アカウントがサポートされています。これを使用して、アプリサーバーまたは信頼できる環境から Firebase サーバー API を呼び出せます。コードをローカルで開発している、または アプリケーションをオンプレミスでデプロイしている場合、このサービス アカウントで取得した認証情報を使用してサーバー リクエストを認可することができます。

サービス アカウントを認証して Firebase サービスへのアクセスを認可するには、秘密鍵ファイルを JSON 形式で生成する必要があります。

サービス アカウント用の秘密鍵ファイルを生成するには:

  1. Firebase コンソールで、[設定] > [サービス アカウント] を開きます。

  2. [新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。

  3. キーを含む JSON ファイルを安全に保管します。

サービス アカウントを介して認可する場合、アプリケーションの認証情報を指定するには 2 つの選択肢があります。GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定することも、サービス アカウント キーへのパスをコード内で明示的に示すこともできます。 1 つ目の選択肢のほうが安全であるため、そちらを強くおすすめします。

環境変数を設定するには:

環境変数 GOOGLE_APPLICATION_CREDENTIALS を、サービス アカウント キーが含まれる JSON ファイルのファイルパスに設定します。 この変数は現在のシェル セッションにのみ適用されるので、新しいセッションを開く場合は、変数を再度設定してください。

Linux または macOS

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

Windows

PowerShell を使用する場合:

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

上記の手順を完了すると、アプリケーションのデフォルト認証情報(ADC)は認証情報を暗黙的に判別できるようになり、Google 以外の環境でテストするか実行するときに、サービス アカウントの認証情報を使用できます。

次に示すように SDK を初期化します。

Node.js

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

Java

FirebaseOptions options = 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(),
    ProjectId = "my-project-id",
});

複数のアプリの初期化

ほとんどの場合、単一のデフォルトのアプリを初期化するだけで済みます。そのアプリからサービスにアクセスするには、次の 2 つの同等の方法があります。

Node.js

// Initialize the default app
const defaultApp = initializeApp(defaultAppConfig);

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

// Retrieve services via the defaultApp variable...
let defaultAuth = getAuth(defaultApp);
let defaultDatabase = getDatabase(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = getAuth();
defaultDatabase = getDatabase();

Java

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

場合によっては、複数のアプリを同時に作成する必要が生じることもあります。たとえば、1 つの Firebase プロジェクトの Realtime Database のデータを読み取り、別のプロジェクト用のカスタム トークンを作成することがあります。あるいは、別々の認証情報を使って 2 つのアプリを認証すべき場合もあります。Firebase SDK では、それぞれ独自の構成情報を使用して複数のアプリを同時に作成できます。

Node.js

// Initialize the default app
initializeApp(defaultAppConfig);

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

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

// Use the shorthand notation to retrieve the default app's services
const defaultAuth = getAuth();
const defaultDatabase = getDatabase();

// Use the otherApp variable to retrieve the other app's services
const otherAuth = getAuth(otherApp);
const otherDatabase = getDatabase(otherApp);

Java

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

Realtime Database と Authentication のスコープの設定

Realtime Database または Authentication 用の Google アプリケーションのデフォルト認証情報を使用する Google Compute Engine VM を使用している場合は、適切なアクセス スコープも設定する必要があります。Realtime Database および Authentication には、userinfo.email および cloud-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"

gcloud エンドユーザー認証情報を使用したテスト

gcloud auth application-default login を実行して取得した Google アプリケーションのデフォルト認証情報を使用して Admin SDK をローカルでテストする場合は、以下の理由により、Firebase Authentication を使用するにあたって追加の変更を行う必要があります。

  • Firebase Authentication は、gcloud OAuth クライアント ID を使用して生成された gcloud エンドユーザー認証情報を受け入れません。
  • これらのタイプのエンドユーザー認証情報を使用する場合、Firebase Authentication では初期化時にプロジェクト ID を指定する必要があります。

回避策として、独自の OAuth 2.0 クライアント ID を使用して gcloud で Google アプリケーションのデフォルト認証情報を生成できます。この OAuth クライアント ID のアプリケーション タイプはデスクトップ アプリである必要があります。

gcloud

gcloud auth application-default login --client-id-file=[/path/to/client/id/file]

アプリの初期化時にプロジェクト ID を明示的に指定できます。または、GOOGLE_CLOUD_PROJECT 環境変数を使用することもできます。後者の場合、コードをテストするために追加の変更を加える必要はありません。

プロジェクト ID を明示的に指定するには:

Node.js

import { initializeApp, applicationDefault } from 'firebase-admin/app';

initializeApp({
  credential: applicationDefault(),
  projectId: '<FIREBASE_PROJECT_ID>',
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setProjectId("<FIREBASE_PROJECT_ID>")
    .build();

FirebaseApp.initializeApp(options);

Python

app_options = {'projectId': '<FIREBASE_PROJECT_ID>'}
default_app = firebase_admin.initialize_app(options=app_options)

Go

config := &firebase.Config{ProjectID: "<FIREBASE_PROJECT_ID>"}
app, err := firebase.NewApp(context.Background(), config)
if err != nil {
        log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "<FIREBASE_PROJECT_ID>",
});

次のステップ

以下で Firebase の詳細を確認します。

Firebase 機能をアプリに追加します。