OAuth 2 アクセス トークンを使用して FCM HTTP v1 API を使用する

1. はじめに

FCM HTTP v1 API は、FCM レガシー API と比較して、有効期間の短いアクセス トークンを使用するより安全な認可モデルを提供します。FCM v1 API のアクセス トークンを生成する手順は、以前の API の手順とは大きく異なります。

この Codelab では、FCM HTTP v1 API を使用して Android アプリにプッシュ通知を送信できるようにするためのクライアント サイドとサーバーサイドの設定手順について説明します。v1 API の認証情報生成の重要な手順をハイライト表示します。

詳細については、以下をご覧ください。

前提条件

  • Java と Android 開発に関する基本的な知識

学習内容

  • FCM HTTP v1 API を使用して Android アプリにプッシュ通知を送信できるようにするためのクライアント サイドとサーバーサイドの設定の詳細な手順
  • サービス アカウントを使用した HTTP v1 API の認証情報の生成
  • HTTP v1 API を使用してテスト メッセージを送信する

必要なもの

Android Studio の最新の安定版

次のいずれかのデバイス:

任意の Java 開発環境またはコードエディタ

2. Firebase プロジェクトと Android アプリの設定

このコードラボの最後には、Firebase Cloud Messaging を使用してアプリにメッセージを送信できるようになります。その前に、Firebase プロジェクトを作成する必要があります。この Codelab では、FCM と統合するためのサンプルコードを含む Android アプリも提供します。

Firebase プロジェクトの設定

Android アプリのセットアップ

この Codelab で提供されるサンプル Android アプリは、すでに FCM と統合されています。起動後、FCM サーバーに登録してトピックをサブスクライブします。この Codelab の後半の手順では、トピック メッセージをトピックに送信し、アプリがそれを受信します。

3. アプリサーバーをセットアップする

アプリの設定が完了したら、FCM v1 API を使用してアプリにメッセージを送信するためのサーバーサイドのコードサンプルをダウンロードする必要があります。このコードは、API 認証情報(次のセクションで説明)を読み込んでアクセス トークンを生成します。その後、FCM トピック メッセージングを使用してアプリにメッセージを送信します。

  • GitHub プロジェクトをダウンロードして、スターター サーバーコードをインポートします。「messaging」プロジェクトは、メッセージを送信する機能を提供する firebase-admin SDK に依存する Gradle ベースの Java プロジェクトです。

アプリサーバーが FCM と連携する方法について詳しくは、サーバー環境と FCM をご覧ください。

4. v1 認証情報を取得する

FCM HTTP v1 API では、OAuth2 セキュリティ モデルに準じた有効期間の短いアクセス トークンを使用します。FCM レガシー API で使用される静的 API キーと比較して、有効期間の短いアクセス トークンは認証情報の漏洩のリスクが低くなります。このセクションでは、API の呼び出しで使用されるアクセス トークンを生成するための認証情報を作成する手順について詳しく説明します。

  1. Firebase Admin SDK が FCM API への呼び出しを承認できるように、Firebase サービス アカウントを設定します。Firebase コンソールで [プロジェクトの設定] を開き、[サービス アカウント] タブを選択します。[新しい秘密鍵を生成] をクリックして、構成スニペットをダウンロードします。プロジェクト設定ページのサービス アカウント コンポーネントの Admin SDK 構成スニペットをハイライト表示したスクリーンショット(切り抜き)
  2. ダウンロードした GitHub プロジェクトで、ダウンロードしたファイルの名前を service-account.json に変更し、プロジェクトの messaging/ パスにコピーします。
  3. Messaging.java クラスの getAccessToken() メソッド(下記参照)は、1 時間有効な OAuth2 トークンを生成します。
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();
}
  1. main メソッドを変更して、次の行を追加します。
public static void main(String[] args) throws IOException {
  System.out.println(getAccessToken());
  ...
}
  1. ターミナルで messaging/ プロジェクト ディレクトリに移動し、次のように入力します。
./gradlew run -Pmessage=common-message

OAuth2 トークンを出力します。

詳細については、送信リクエストを承認するをご覧ください。

5. REST API でメッセージを送信する

これで、HTTP v1 API を介してメッセージを送信する準備が整いました。手順は次のとおりです。

  • アクセス トークンを HTTP リクエスト ヘッダーに追加するには:
  • トークンを Authorization ヘッダーの値として Authorization: Bearer <access_token> の形式で追加します。
  • curl を使用して FCM v1 API に HTTP リクエストを送信します。
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $OAuth2_token" -H "X-GFE-SSL: yes" -d  "{\"message\": {\"topic\": \"$topic_name\", \"notification\": {\"title\": \"breaking news\", \"body\": \"This is breaking news\"}}}" https://fcm.googleapis.com/v1/projects/[PROJECT_NAME]/messages:send

上記の $topic_name は、Firebase プロジェクトと Android アプリの設定で説明した Android アプリのコードにあります。デフォルトでは "weather" になっています。

  • メッセージが正常に配信されると、下の画像のような通知が画面に表示されます。

54ae84ece22202cd.png

6. まとめ

これで完了です。この Codelab を完了すると、次のことができるようになります。

  • Firebase プロジェクトを設定します
  • Firebase を Android アプリと統合する
  • FCM HTTP v1 API の認証情報を作成する
  • FCM HTTP v1 API を使用してアプリにメッセージを送信する

FCM が提供する高度な機能については、次のリファレンスをご覧ください。