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

事前準備

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

  • Admin Node.js SDK を使用する場合は、Node.js 0.12 以降を実行するサーバー。
  • Admin Java SDK を使用する場合は、Java 7 以降を実行するサーバー。
  • サーバーアプリ。

アプリに Firebase を追加する

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

  1. プロジェクトの設定ページの [サービス アカウント] タブに移動します。
  2. Firebase プロジェクトを選択します。まだ存在しない場合は、[新規プロジェクトを作成] ボタンをクリックします。アプリに関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。
  3. [サービス アカウント] タブの [Firebase Admin SDK] セクション下部にある [新しい秘密鍵を生成] ボタンをクリックします。

ボタンをクリックすると、サービス アカウントの認証情報を含む JSON ファイルがダウンロードされます。この認証情報は、次のステップで SDK を初期化する際に必要です。

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:4.0.3'
}

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

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

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

FirebaseOptions options = new FirebaseOptions.Builder()
  .setServiceAccount(new FileInputStream("path/to/serviceAccountKey.json"))
  .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
  .build();

FirebaseApp.initializeApp(options);

データベース名は、Firebase console プロジェクトの [データベース] ページにあります。

あるいは、別のタイプの認証情報を使用して 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"
});

Google Cloud Platform 内でコードを実行する場合、Google アプリケーション デフォルト認証情報を使用すると、Admin Node.js SDK 自体がサービス アカウントを自動的にフェッチします。

Node.js

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

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

Node.js

var refreshToken; // Get refresh token from OAuth2 flow

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

これで、サーバーで Firebase Admin SDK を使用して、カスタム認証の実装Firebase Authentication ユーザーの管理Realtime Database のデータの読み書きができるようになりました。

複数のアプリの初期化

ほとんどの場合、単一の(デフォルトの)アプリを初期化するだけで済みます。次のようにして、そのアプリからサービスにアクセスできます(この 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();

場合によっては、複数のアプリを同時に作成する必要が生じることもあります。たとえば、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);

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