サーバー用のインストールと設定

このドキュメントでは、Firebase Server SDK をプロジェクトに追加する方法について説明します。

登録 & 開始

アカウントの作成とプロジェクトの設定

Firebase console では、Firebase プロジェクトを作成、管理、削除できます。特定の Firebase プロジェクトの [データベース] パネルをクリックすると、アプリのデータをリアルタイムに表示したり変更したりできます。また、アプリのダッシュボードでは、セキュリティ ルールと Firebase ルールの設定、アプリの認証の管理、デプロイ、およびアナリティクスの表示を行うことができます。

Server SDK の設定

Firebase Realtime Database をサーバー上で使い始めるには、まず、選択した言語で Firebase Server SDK を設定する必要があります。

Server SDK の認証

Firebase Server SDK を使用してサーバーから Firebase Realtime Database にアクセスするには、あらかじめ Firebase でサーバーを認証しておく必要があります。サーバーを認証するときは、クライアント アプリで行うようにユーザー アカウントの認証情報を使用してログインするのではなく、Firebase に対してサーバーを識別するサービス アカウントで認証します。

Firebase Server SDK を使用して認証すると、3 種類のアクセスレベルを取得できます。

Firebase Server SDK の認証アクセスレベル
管理者権限 プロジェクトの Realtime Database に対する完全な読み取りおよび書き込みアクセス権。この権限は、プロジェクトのリソースへの無制限のアクセスが必要な管理者タスクを完了する場合に注意して使用してください。
制限された権限 プロジェクトの Realtime Database へのアクセス権。ただし、使用しているサーバーで必要とするリソースに限定されます。アクセス要件が明確に定義されている管理者タスクを完了する場合に使用してください。
未認証 プロジェクトの Realtime Database に対する未認証の読み取りおよび書き込みアクセス権。公開データの読み取り権または書き込み権のみがサーバーに必要な場合に役立ちます。現在、これは Node.js SDK にのみ使用できます。

管理者権限による認証

Firebase プロジェクトに対する編集者の役割を持つサービス アカウントの認証情報を使用して FirebaseApp を初期化すると、そのインスタンスはプロジェクトの Realtime Database への完全な読み取り / 書き込みアクセス権を持ちます。

Java
// Initialize the app with a service account, granting admin privileges
FirebaseOptions options = new FirebaseOptions.Builder()
    .setDatabaseUrl("https://databaseName.firebaseio.com")
    .setServiceAccount(new FileInputStream("path/to/serviceAccountCredentials.json"))
    .build();
FirebaseApp.initializeApp(options);

// As an admin, the app has access to read and write all data, regardless of Security Rules
DatabaseReference ref = FirebaseDatabase
    .getInstance()
    .getReference("restricted_access/secret_document");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Object document = dataSnapshot.getValue();
        System.out.println(document);
    }
});
Node.js
var firebase = require("firebase");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "path/to/serviceAccountCredentials.json"
});

// As an admin, the app has access to read and write all data, regardless of Security Rules
var db = firebase.database();
var ref = db.ref("restricted_access/secret_document");
ref.once("value", function(snapshot) {
  console.log(snapshot.val());
});

制限された権限による認証

サービスで必要とするリソースへのアクセス権のみを付与するのがおすすめの方法です。FirebaseApp インスタンスがアクセスできるリソースに対してより細かい制御を行うには、セキュリティ ルールで一意の識別子を使用してサービスを表します。次に、必要とするリソースへのアクセス権をサービスに付与する適切なルールを設定します。次に例を示します。

{
  "rules": {
    "some_resource": {
      ".read": "auth.uid === 'my-service-worker'",
      ".write": false
    },
    "another_resource": {
      ".read": "auth.uid === 'my-service-worker'",
      ".write": "auth.uid === 'my-service-worker'"
    }
  }
}

次に、FirebaseApp オブジェクトを初期化するときにサーバー上で、databaseAuthVariableOverride パラメータを使用してデータベース ルールで使用される auth オブジェクトを上書きします。このカスタムの auth オブジェクトの uid フィールドを、セキュリティ ルールのサービスを表すために使用した識別子に設定します。

Java
// Initialize the app with a custom auth variable, limiting the server's access
Map<String, Object> auth = new HashMap<String, Object>();
auth.put("uid", "my-service-worker");

FirebaseOptions options = new FirebaseOptions.Builder()
    .setDatabaseUrl("https://databaseName.firebaseio.com")
    .setServiceAccount(new FileInputStream("path/to/serviceAccountCredentials.json"))
    .setDatabaseAuthVariableOverride(auth)
    .build();
FirebaseApp.initializeApp(options);

// The app only has access as defined in the Security Rules
DatabaseReference ref = FirebaseDatabase
    .getInstance()
    .getReference("/some_resource");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String res = dataSnapshot.getValue();
        System.out.println(res);
    }
});
Node.js
var firebase = require("firebase");

// Initialize the app with a custom auth variable, limiting the server's access
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "path/to/serviceAccountCredentials.json",
  databaseAuthVariableOverride: {
    uid: "my-service-worker"
  }
});

// The app only has access as defined in the Security Rules
var db = firebase.database();
var ref = db.ref("/some_resource");
ref.once("value", function(snapshot) {
  console.log(snapshot.val());
});

未認証アクセス

プロジェクトの Realtime Database への読み取りおよび書き込み権限のみがサーバーに必要な場合、サービス アカウントを使用せずに Server SDK を初期化できます。現在、これは Node.js SDK にのみ使用できます。
Node.js
var firebase = require("firebase");

// Initialize the app with no authentication
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com"
});

// The app only has access to public data as defined in the Security Rules
var db = firebase.database();
var ref = db.ref("/some_public_resource");
ref.once("value", function(snapshot) {
  console.log(snapshot.val());
});

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