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

Admin SDK を使用すると、特権環境から Firebase と対話し、次のような操作を行うことができます。

  • Realtime Database のデータの読み取りと書き込みを完全な管理者権限で実行する。
  • FCM サーバー プロトコルへの簡単な代替アプローチを使用して、プログラムにより Firebase Cloud Messaging FCM を送信する。
  • Firebase 認証トークンを生成し確認する。
  • 独自の簡単な管理コンソールを作成して、認証ユーザーのデータの検索や、認証ユーザーのメールアドレス変更などの作業を行う。

こうした用途のため Admin SDK を統合する方法の詳細については、対応する Realtime DatabaseFCM、および Authentication のドキュメントを参照してください。このページの残りの部分では、Admin SDK の基本的なセットアップに焦点を当てます。

事前準備

Firebase を追加する前に、次の準備をしてください。

  • Admin Node.js SDK を使用する場合は、Node.js 4.0 以降を実行するサーバー
  • Admin Java SDK を使用する場合は、Java 7 以降を実行するサーバー
  • Admin Python SDK を使用する場合は、Python 2.7 以降または 3.x を実行するサーバー
  • サーバーアプリ

選択した Admin SDK が、使用する機能をサポートしていることを確認してください。以下に、各言語でサポートされている機能を示す機能マトリックスを示します。

機能 Node.js Java Python
カスタム トークン作成
ID トークンの確認
Realtime Database API
User Management API
Cloud Messaging API

アプリに Firebase を追加する

Firebase Admin SDK を使用するには、Firebase プロジェクト、Firebase サービスと通信するためのサービス アカウント、サービス アカウントの認証情報が設定された設定ファイルが必要です。

  1. プロジェクトの設定ページの [サービス アカウント] タブに移動します。
  2. Firebase プロジェクトを選択します。まだプロジェクトがない場合は、[新規プロジェクトを作成] をクリックします。アプリに関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。
  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

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

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

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

import * as admin from "firebase-admin";

Java

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

dependencies {
  compile 'com.google.firebase:firebase-admin:5.0.1'
}

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

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

Python

Firebase Admin Python SDK は pip を利用して入手できます。sudo を使用すれば、すべてのユーザーのライブラリをインストールできます。

$ sudo pip install firebase-admin

または、--user フラグを渡して現在のユーザーだけのライブラリをインストールすることもできます。

$ pip install --user firebase-admin

SDK を初期化する

Firebase console プロジェクトを作成し、サービス アカウントの認証情報が含まれる 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"
});

Java

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

FirebaseOptions options = new FirebaseOptions.Builder()
  .setCredential(FirebaseCredentials.fromCertificate(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)

データベース名は、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"
});

Java

FirebaseOptions options = new FirebaseOptions.Builder()
  .setCredential(FirebaseCredentials.applicationDefault())
  .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
  .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

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

Node.js

var refreshToken; // Get refresh token from OAuth2 flow

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

Java

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

FirebaseOptions options = new FirebaseOptions.Builder()
  .setCredential(FirebaseCredentials.fromRefreshToken(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)

これで、Firebase Admin SDK を使用して以下のタスクを実行する準備が整いました。

複数のアプリを初期化する

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

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

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
FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
FirebaseDatabase 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(...)

場合によっては、複数のアプリを同時に作成する必要が生じることもあります。たとえば、1 つの Firebase プロジェクトの Realtime Database のデータを読み取り、別のプロジェクト用のカスタム トークンを作成することがあります。あるいは、別々の認証情報を使って 2 つのアプリを認証すべき場合もあります。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();

Java

// Initialize the default app
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)

次のステップ

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

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

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。