Management REST API を使用して Firebase プロジェクトを設定、管理する

Firebase Management REST API を使用すると、Firebase プロジェクトの Firebase リソースや Firebase アプリなどの設定や管理をプログラムから行うことができます。

この概要では、現在 Firebase サービスを使用していない既存の Google Cloud プロジェクトに、Firebase のリソースとアプリを追加するための一般的なワークフローについて説明します。

必要に応じて、このページの特定のセクションにお進みください。

このページの手順を行う前に、API が有効になっていることを確認してください。

Firebase Management API のアクセス管理については、Cloud Identity Access Management(IAM)API のドキュメントをご覧ください。

始める前に

まず、Google Cloud プロジェクトで Management API を有効にして、アクセス トークンを生成する必要があります。

Google Cloud プロジェクトで Management REST API を有効にする

まだ有効にしていない場合は、Google Cloud プロジェクトで使用できるように Firebase Management API を有効にする必要があります。

  1. Google API Console で Firebase Management API ページを開きます。
  2. プロンプトが表示されたら、対象の Google Cloud プロジェクトを選択します。
  3. Firebase Management API ページで [有効にする] をクリックします。

API アクセス トークンを生成する

アクセス トークンを取得する Node.js の例を以下に示します。

まず、Google Cloud 環境を使用していない場合は、GOOGLE_APPLICATION_CREDENTIALS 環境変数にサービス アカウント キーのパスを設定します。

Linux または macOS

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json"

Windows

PowerShell を使用する場合:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\service-account-file.json"

次に、Firebase Admin SDK を使用して、サービス アカウントの認証情報からアクセス トークンを取得します。

const admin = require('firebase-admin');

function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

プロジェクトのリソース名を確認する

Firebase サービスの追加に使用できる Google Cloud プロジェクトを確認できます。

リクエスト

availableProjects.list を呼び出します。この呼び出しのリクエスト本文は空にする必要があります。

利用可能な Google Cloud プロジェクトのリストをリクエストする Node.js の例を以下に示します。

const fetch = require('node-fetch');

async function listProjects() {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/availableProjects';
  const options = {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    const projects = resp['projectInfo'];
    console.log('Project total: ' + projects.length);
    console.log('');
    for (let i in projects) {
      const project = projects[i];
      console.log('Project ' + i);
      console.log('ID: ' + project['project']);
      console.log('Display Name: ' + project['displayName']);
      console.log('');
    }
  } catch(err) {
    console.error(err);
  }
}

結果

availableProjects.list 呼び出しのレスポンスの本文に ProjectInfo オブジェクトのリストが含まれます。プロジェクトのリストが長すぎる場合、レスポンス本文には nextPageToken も含まれます。これをクエリ パラメータとして使用して次のページを取得できます。

availableProjects.list 呼び出しのレスポンス本文の例を以下に示します。

{
  "projectInfo": [
    {
      "project": "projects/first-cloud-project",
      "displayName": "First Cloud Project"
    },
    {
      "project": "projects/second-cloud-project",
      "displayName": "Second Cloud Project"
    }
  ]
}

このレスポンス例には Firebase サービスを追加できる 2 つの Google Cloud プロジェクトが含まれています。project フィールドに、グローバルに一意のプロジェクト リソース名が含まれています。

availableProjects.list からのレスポンスに含まれている project の値を使用して、プロジェクトに Firebase サービスを追加したり、アプリを追加したりできます。

次のセクションでは、リソース名 projects/first-gcp-project を使用して、First Cloud Project に Firebase サービスを追加します。

プロジェクトに Firebase サービスを追加する

Google Cloud プロジェクトでは、Firebase が提供するサービスを利用できます。このセクションでは、プログラムを使用して既存の Google Cloud プロジェクトに Firebase サービスを追加する方法について説明します。Firebase コンソールで既存の Google Cloud プロジェクトに Firebase サービスを追加することもできます。

リクエスト

projects.addFirebase を呼び出します。この呼び出しのリクエスト本文は空にする必要があります。

Google Cloud プロジェクトに Firebase サービスを追加する Node.js の例を以下に示します。

const fetch = require('node-fetch');

async function addFirebase(projectId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + ':addFirebase';
  const options = {
    method: 'POST',
    // Use a manual access token here since explicit user access token is required.
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

結果

projects.addFirebase 呼び出しの結果は Operation です。プロジェクトで他の Firebase 関連のエンドポイントを呼び出す前に、このオペレーションが正常に完了している必要があります。

オペレーションが正常に完了したかどうかを確認するには、オペレーションに対して operations.get を呼び出します。done の値が true であり、response のタイプが FirebaseProject であれば正常に完了しています。オペレーションが失敗した場合、error が設定され、その値は google.rpc.Status になります。

operations.get 呼び出しのレスポンス本文は次のようになります。

{
  "name": "operations/...",
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.firebase.service.v1beta1.FirebaseProject",
    "projectId": "first-cloud-project",
    "projectNumber": "...",
    "displayName": "First Cloud Project",
    "name": "projects/first-cloud-project",
    "resources": {
      "hostingSite": "first-cloud-project",
      "realtimeDatabaseInstance": "first-cloud-project"
    }
  }
}

donetrue であり、response のタイプが FirebaseProject であるため、Google Cloud プロジェクトに Firebase サービスが追加されたことがわかります。レスポンスには、新たに作成された FirebaseProject に関するその他の有用な情報(projectNumber やデフォルトの resources など)も含まれます。完了後、Operation は自動的に削除されます。

プロジェクトに Firebase アプリを追加する

iOS、Android、ウェブアプリなど、さまざまなアプリで FirebaseProject を使用できます。このセクションでは、プログラムで既存の FirebaseProject に Firebase アプリを追加する方法について説明します。Firebase コンソールで既存の Firebase プロジェクトに Firebase アプリを追加することもできます。

Firebase プロジェクトに追加する Firebase アプリの種類を選択してください。

既存の Google アナリティクス アカウントを、プログラムで既存の FirebaseProject にリンクできます。また、[プロジェクトの設定] の [統合] タブでも既存の Firebase プロジェクトを Google アナリティクスにリンクできます。

projects.addGoogleAnalytics の呼び出しには analytics_resource が必要です。これには analyticsAccountId または analyticsPropertyId を指定できます。

  • アカウント内で新しい Google アナリティクス プロパティをプロビジョニングし、その新しいプロパティを Firebase プロジェクトに関連付けるには、既存の analyticsAccountId を指定します。

  • Google アナリティクスのプロパティを Firebase プロジェクトに関連付けるには、既存の analyticsPropertyId を指定します。

analyticsAccountId と既存の analyticsPropertyId はどちらも Google アナリティクスのウェブサイトで確認できます。

projects.addGoogleAnalytics を呼び出したときの動作:

  1. 最初に、Google アナリティクス プロパティの既存のデータ ストリームが FirebaseProject の既存の Firebase アプリに対応しているかどうかがチェックされます(そのデータ ストリームに関連付けられている packageName または bundleId に基づきます)。次に、データ ストリームとアプリがリンクされます(該当する場合)。この自動リンクは、Android アプリと iOS アプリにのみ適用されます。

  2. Firebase アプリに対応するデータ ストリームが見つからない場合は、各 Firebase アプリの Google アナリティクス プロパティ内に新しいデータ ストリームがプロビジョニングされます。ウェブアプリには必ず新しいデータ ストリームがプロビジョニングされます。これは、以前にウェブアプリがアナリティクス プロパティのデータ ストリームと関連付けられていた場合でも同様です。

Google アナリティクス アカウントの階層と構造について詳しくは、アナリティクスのドキュメントをご覧ください。

リクエスト

projects.addGoogleAnalytics を呼び出します。

以下の例では、project.addGoogleAnalytics 呼び出しのリクエスト本文に Google アナリティクス アカウント analyticsAccountId を指定しています。この呼び出しにより、新しい Google アナリティクス プロパティがプロビジョニングされ、新しいプロパティが FirebaseProject に関連付けられます。

{
  "analyticsAccountId": "<your-google-analytics-account-id>"
}

Firebase プロジェクトと Google アナリティクス アカウントをリンクする Node.js の例を以下に示します。

const fetch = require('node-fetch');

async function addGoogleAnalytics(projectId, analyticsAccountId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + ':addGoogleAnalytics';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
    body: JSON.stringify({
      'analyticsAccountId': analyticsAccountId
    }),
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

結果

projects.addGoogleAnalytics 呼び出しの結果は Operation です。プロジェクトで他の Firebase 関連のエンドポイントを呼び出す前に、このオペレーションが正常に完了している必要があります。

オペレーションが正常に完了したかどうかを確認するには、オペレーションに対して operations.get を呼び出します。done の値が true であり、response のタイプが analyticsDetails であれば正常に完了しています。オペレーションが失敗した場合、error が設定され、その値は google.rpc.Status になります。

operations.get 呼び出しのレスポンス本文は次のようになります。

{
  "name": "operations/...",
  "none": true,
  "response": {
    "@type": "type.googleapis.com/google.firebase.service.v1beta1.AnalyticsDetails",
    "analyticsProperty": [
      {
        "id": "...",
        "displayName": "..."
      }
    ],
    "streamMappings": [
      {
        "app": "...",
        "streamId": "...",
        "measurementId": "..."
      }
    ]
  }
}

done が true であり、response のタイプが analyticsDetails であるため、指定した Google アナリティクス アカウントに FirebaseProject がリンクされたことがわかります。完了後、Operation は自動的に削除されます。

プロジェクトのデフォルト ロケーションを確定する(省略可)

Firebase プロジェクトで Cloud Firestore、Cloud Storage、App Engine のアプリを使用する場合は、プログラムでプロジェクトのデフォルトの Google Cloud Platform(GCP)リソース ロケーションを確定できます。Firebase コンソールでロケーションを選択することもできます。

このロケーションを設定する前に、プロジェクトのロケーションを選択するを参照して、プロジェクトに最適なロケーションを確認してください。また、projects.availableLocations を呼び出して有効なロケーションのリストを取得してください。プロジェクトが Google Cloud 組織の一部である場合、プロジェクトで選択できるロケーションが組織のポリシーで制限されている場合があるためです。

defaultLocation.finalize メソッドを呼び出すと、App Engine アプリケーションが作成され、そのアプリケーションのデフォルトの Cloud Storage バケットのロケーションは、リクエスト本文で指定した locationId になります。

Project に App Engine アプリケーションがすでにある場合や、この defaultLocation.finalize メソッドが以前に呼び出されていた場合は、デフォルトの GCP リソース ロケーションがすでに指定されている可能性があります。

リクエスト

projects.defaultLocation.finalize を呼び出します。リクエスト本文の作成方法は次のとおりです。

  • 必須:

    • locationId: Cloud Firestore や Cloud Storage など、ロケーションの設定が必要な GCP サービスのデータが保存されるロケーション。
{
  "locationId": "us-west2"
}

プロジェクトのデフォルト ロケーションを確定する Node.js の例を以下に示します。

const fetch = require('node-fetch');

async function finalizeProjectLocation(projectId, locationId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + '/defaultLocation:finalize';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
    body: JSON.stringify({
      'locationId': locationId
    }),
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

結果

projects.defaultLocation.finalize 呼び出しの結果は Operation です。プロジェクトで他の Firebase 関連のエンドポイントを呼び出す前に、このオペレーションが正常に完了している必要があります。

オペレーションが正常に完了したかどうかを確認するには、オペレーションに対して operations.get を呼び出します。done の値が true であり、response のタイプが google.protobuf.Empty であれば正常に完了しています。オペレーションが失敗すると、レスポンス本文の error のタイプは google.rpc.Status になります。完了後、Operation は自動的に削除されます。