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

1. はじめに

FCM レガシー API と比較して、FCM HTTP v1 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 アプリのセットアップ

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

Firebase プロジェクトの設定

Android アプリのセットアップ

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

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

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

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

アプリサーバーと FCM の連携について詳しくは、サーバー環境と FCM のドキュメントをご覧ください。

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

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

  1. Firebase サービス アカウントを設定して、Firebase Admin SDK が FCM API の呼び出しを承認できるようにします。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: Bearer <access_token> の形式で Authorization ヘッダーの値として追加します。
  • 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 が提供する高度な機能を確認するには、次のリファレンスが有用です。