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 機能を示す機能マトリックスを示します。
この用途で Admin SDK を統合する方法については、対応する Realtime Database、FCM、Authentication、Remote Config、Cloud Storage のドキュメントをご覧ください。このページの残りの部分では、Admin SDK の基本的なセットアップに焦点を当てます。
前提条件
サーバーアプリがインストールされていることを確認します。
使用する Admin SDK に応じて、サーバーで以下が実行できるか確認してください。
- Admin Node.js SDK - Node.js 12 以降
- Admin Java SDK - Java 7 以降(Java 8 以降を推奨)
Java 7 のサポートは非推奨になりました。 - Admin Python SDK - Python 3.6 以降
- Admin Go SDK - Go 1.15 以降
- 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:8.1.0'
}
Maven を使用してアプリケーションをビルドしている場合は、pom.xml
に次の依存関係を追加できます。
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>8.1.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
ユーティリティを使用してインストールできます。
# Install as a module dependency
$ go get firebase.google.com/go/v4
# Install to $GOPATH
$ go get firebase.google.com/go
C#
.NET Admin SDK は、.NET package manager を使用してインストールできます。
$ Install-Package FirebaseAdmin -Version 2.3.0
または、dotnet
コマンドライン ユーティリティを使用してインストールします。
$ dotnet add package FirebaseAdmin --version 2.3.0
または、次のパッケージ参照エントリを .csproj
ファイルに追加してインストールできます。
<ItemGroup>
<PackageReference Include="FirebaseAdmin" Version="2.3.0" />
</ItemGroup>
SDK の初期化
Firebase プロジェクトを作成したら、サービス アカウント ファイルと Google アプリケーションのデフォルト認証情報を組み合わせた認可方法で SDK を初期化できます。
Firebase プロジェクトでは Google サービス アカウントがサポートされています。これを使用して、アプリサーバーまたは信頼できる環境から Firebase サーバー API を呼び出せます。コードをローカルで開発している、または アプリケーションをオンプレミスでデプロイしている場合、このサービス アカウントで取得した認証情報を使用してサーバー リクエストを認可することができます。
サービス アカウントを認証して Firebase サービスへのアクセスを認可するには、秘密鍵ファイルを JSON 形式で生成する必要があります。
サービス アカウント用の秘密鍵ファイルを生成するには:
Firebase コンソールで、[設定] > [サービス アカウント] を開きます。
[新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。
キーを含む 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(),
});
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"),
});
パラメータなしで初期化する
SDK はパラメータなしで初期化することもできます。この場合、SDK は Google アプリケーションのデフォルト認証情報を使用します。デフォルト認証情報の検索は Google 環境で完全に自動化されており、環境変数やその他の構成を指定する必要がないため、Compute Engine、Kubernetes Engine、App Engine、Cloud Functions を使用するアプリケーションでは、この方法で 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 を使用して次のタスクを行うことができます。
- カスタム認証の実装
- Firebase Authentication ユーザーの管理
- Realtime Database からのデータの読み取りと書き込み
- Firebase Cloud Messaging メッセージの送信
複数のアプリの初期化
ほとんどの場合、単一のデフォルトのアプリを初期化するだけで済みます。そのアプリからサービスにアクセスするには、次の 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 アプリのサンプルを確認する。
Admin SDK の作成者による Admin SDK 関連のブログ投稿をご覧ください。例: プロキシ サーバーを介した Firestore と Firebase へのアクセス。
Firebase 機能をアプリに追加します。
- Cloud Functions でサーバーレス バックエンドを作成する。
- Realtime Database で情報を保存するか、Cloud Storage で blob データを保存する。
- Cloud Messaging を使用して通知を受け取る。