FCM HTTP v1 API を使用してメッセージを送信する

FCM HTTP v1 API を使用すると、メッセージ リクエストを作成し、それらを以下のタイプのターゲットに送信できます。

  • トピック名
  • 条件
  • デバイス登録トークン
  • デバイス グループ名(プロトコルのみ)

事前定義フィールドで構成される通知ペイロード、独自のユーザー定義フィールドのデータ ペイロード、またはそれら両方のタイプのペイロードを含むメッセージを使用して、メッセージを送信できます。詳細については、メッセージのタイプを参照してください。

HTTP v1 の送信リクエストを承認する

サーバー環境の詳細に応じて、Firebase サービスへのサーバー リクエストを認可するために、これらの戦略の組み合わせを使用します。

  • Google アプリケーションのデフォルト認証情報(ADC)
  • サービス アカウントの JSON ファイル
  • サービス アカウントから派生した、有効期間が短い OAuth 2.0 アクセス トークン

アプリケーションが Compute EngineGoogle Kubernetes EngineApp Engine、Cloud Functions(Cloud Functions for Firebase を含む)のいずれかで実行されている場合は、アプリケーションのデフォルト認証情報(ADC)を使用してください。ADC では既存のデフォルト サービス アカウントを使用してリクエストを認可するための認証情報を取得します。また、環境変数 GOOGLE_APPLICATION_CREDENTIALS を使用して、柔軟なローカルテストも実現します。認可フローを最大限に自動化するには、ADC を Admin SDK サーバー ライブラリと一緒に使用してください。

アプリケーションが Google 以外のサーバー環境で実行されている場合、Firebase プロジェクトからサービス アカウントの JSON ファイルをダウンロードする必要があります。秘密鍵ファイルが含まれているファイル システムにアクセスできる場合は、環境変数 GOOGLE_APPLICATION_CREDENTIALS を使用して、手動で取得した認証情報でリクエストを認可できます。こうしたファイル アクセス権がない場合は、サービス アカウント ファイルをコード内で参照する必要があります。この操作は、認証情報が流出する危険性があるため、細心の注意を払って行ってください。

ADC を使用して認証情報を提供する

Google アプリケーションのデフォルト認証情報(ADC)では、以下の順番で認証情報が確認されます。

  1. ADC が、環境変数 GOOGLE_APPLICATION_CREDENTIALS が設定されているかどうかを確認します。変数が設定されている場合、ADC はその変数が指しているサービス アカウント ファイルを使用します。

  2. 環境変数が設定されていない場合、ADC はサービスで実行されているアプリケーションに応じて、Compute EngineGoogle Kubernetes EngineApp Engine、Cloud Functions によって提供されているデフォルトのサービス アカウントを使用します。

  3. ADC が上記のどの認証情報も使用できない場合、エラーが発生します。

次の Admin SDK サンプルコードは、これらのプロセスを表しています。このサンプルでは、アプリケーション認証情報は明示的には指定されていません。ただし、環境変数が設定されているか、アプリケーションが Compute EngineGoogle Kubernetes EngineApp Engine、Cloud Functions のいずれかで実行されている限り、ADC は認証情報を暗黙的に検出できます。

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

認証情報を手動で提供する

Firebase プロジェクトでは Google サービス アカウントがサポートされています。これを使用して、アプリサーバーまたは信頼できる環境から Firebase サーバー API を呼び出せます。コードをローカルで開発している、または アプリケーションをオンプレミスでデプロイしている場合、このサービス アカウントで取得した認証情報を使用してサーバー リクエストを認可することができます。

サービス アカウントを認証して Firebase サービスへのアクセスを認可するには、秘密鍵ファイルを JSON 形式で生成する必要があります。

サービス アカウント用の秘密鍵ファイルを生成するには:

  1. Firebase コンソールで、[設定] > [サービス アカウント] を選択します。

  2. [新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。

  3. キーを含む JSON ファイルを安全に保管します。

サービス アカウントを介して認可する場合、アプリケーションの認証情報を指定するには 2 つの選択肢があります。GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定することも、サービス アカウント キーへのパスをコード内で明示的に示すこともできます。 1 つ目の選択肢のほうが安全であるため、そちらを強くおすすめします。

環境変数を設定するには:

環境変数 GOOGLE_APPLICATION_CREDENTIALS を、サービス アカウント キーが含まれる JSON ファイルのファイルパスに設定します。 この変数は現在のシェル セッションにのみ適用されるので、新しいセッションを開く場合は、変数を再度設定してください。

Linux または macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

PowerShell を使用する場合:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

上記の手順を完了すると、アプリケーションのデフォルト認証情報(ADC)は認証情報を暗黙的に判別し、Google 以外の環境でテストまたは実行する際にサービス アカウントの認証情報を使用できるようになります。

認証情報を使用してアクセス トークンを作成する

自動的に認証を処理する Firebase Admin SDK を使用していない場合、アクセス トークンを作成して送信リクエストに追加する必要があります。

次に示すように、有効期間の短い OAuth 2.0 アクセス トークンを取得するために、使用する言語の Google 認証ライブラリと一緒に Firebase 認証情報を使用します。

node.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

この例では、Google API クライアント ライブラリはリクエストを JSON Web Token(JWT)で認証します。詳細については、JSON Web Token をご覧ください。

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = service_account.Credentials.from_service_account_file(
    'service-account.json', scopes=SCOPES)
  request = google.auth.transport.requests.Request()
  credentials.refresh(request)
  return credentials.token

Java

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refresh();
  return googleCredentials.getAccessToken().getTokenValue();
}

アクセス トークンが期限切れになると、更新されたアクセス トークンを取得するために、トークンの更新メソッドが自動的に呼び出されます。

FCM へのアクセスを認可するには、スコープ https://www.googleapis.com/auth/firebase.messaging をリクエストします。

アクセス トークンを HTTP リクエスト ヘッダーに追加するには:

トークンを Authorization ヘッダーの値として Authorization: Bearer <access_token> の形式で追加します。

node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Java

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getServiceAccountAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

別のプロジェクトのサービス アカウントを使用して承認する

プロジェクト(ターゲット プロジェクト)のメッセージを、別のプロジェクト(送信元プロジェクト)のサービス アカウントから生成された OAuth 2.0 トークンを使用して送信できます。これにより、他のプロジェクトの代わりにメッセージを送信しながら、1 つのプロジェクトでサービス アカウントの管理を一元化できます。これを行う手順は次のとおりです。

  1. API を有効にする: 送信元プロジェクトで Firebase Cloud Messaging API が有効になっていることを確認します。
  2. サービス アカウントを作成する: 送信元プロジェクトにサービス アカウントを作成します。
  3. 権限を付与する: ターゲット プロジェクトの IAM ページで、サービス アカウントのメールアドレスに Firebase Cloud Messaging API 管理者のロールを付与します。これにより、他のプロジェクトのサービス アカウントがターゲット プロジェクトにメッセージを送信できます。
  4. トークンを取得する: 送信元プロジェクトのサービス アカウントの OAuth 2.0 アクセス トークンを生成します。次のいずれかの方法で行うことができます。
    • サービス アカウント キーの JSON ファイルをダウンロードして使用します。
    • または、サービスが Google Cloud で実行されている場合は、Workload Identity を使用します。
  5. リクエストを送信する: 取得したアクセス トークンを送信リクエストの Authorization ヘッダーで使用します。リクエストは、ターゲット プロジェクトの HTTP v1 エンドポイントに対して行う必要があります。
        POST https://fcm.googleapis.com/v1/TARGET_PROJECT_ID/messages:send

特定のデバイスにメッセージを送信する

特定の 1 つのデバイスに送信するには、次に示すようにデバイスの登録トークンを渡します。

REST

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
   "message":{
      "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

cURL コマンド:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
   "notification":{
     "title":"FCM Message",
     "body":"This is an FCM Message"
   },
   "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

成功した場合、HTTP v1 API レスポンスはメッセージ ID を含む JSON オブジェクトになります。

    {
      "name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96"
    }

FCM HTTP v1 API を使用してテスト通知メッセージを送信する

このセクションでは、FCM HTTP v1 API を使用してテスト通知メッセージを送信する方法について説明します。

HTTP リクエストの URL

リクエストは、次の URL にある指定されたターゲット(登録トークン、トピック、条件)への HTTP POST で構成されています。

POST https://fcm.googleapis.com/v1/projectId/messages:send

HTTP リクエストの完全な JSON サンプル

HTTP POST リクエスト内で通知を投稿する方法を示す完全な例を次に示します。

{
  "message": {
    "token": REGISTRATION_TOKEN,
    "notification": {
      "title": "FCM API test",
      "body": "This is the body of the notification.",
      "image": "https://cat.10515.net/1.jpg"
    }
  }
}

実行

[実行] をクリックして、API Explorer でサンプルを試します。