Admin Database API の概要

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

登録 & 開始

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

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

Admin SDK のセットアップ

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

Admin SDK の認証

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

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

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

管理者権限による認証

Firebase プロジェクトに対する **編集者** の役割を持つサービス アカウントの認証情報を使用して Firebase Admin SDK を初期化すると、そのインスタンスはプロジェクトの 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 admin = require("firebase-admin");

// Fetch the service account key JSON file contents
var serviceAccount = require("path/to/serviceAccountKey.json");

// Initialize the app with a service account, granting admin privileges
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://databaseName.firebaseio.com"
});

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

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

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

{
  "rules": {
    "public_resource": {
      ".read": true,
      ".write": true
    },
    "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 admin = require("firebase-admin");

// Fetch the service account key JSON file contents
var serviceAccount = require("path/to/serviceAccountKey.json");

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

// The app only has access as defined in the Security Rules
var db = admin.database();
var ref = db.ref("/some_resource");
ref.once("value", function(snapshot) {
  console.log(snapshot.val());
});
Admin SDK を未認証クライアントとして機能させるのが適切な場合もあります。これを行うには Node.js SDK で databaseAuthVariableOverride プロパティの値 null を渡すことができます。
Node.js
var admin = require("firebase-admin");

// Fetch the service account key JSON file contents
var serviceAccount = require("path/to/serviceAccountKey.json");

// Initialize the app with a null auth variable, limiting the server's access
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://databaseName.firebaseio.com",
  databaseAuthVariableOverride: null
});

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

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