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 の高度な機能については、以下のリファレンスが有用です。