Memo

メモ > 技術 > サービス: AmazonSNS > Android: Firebaseの鍵ファイルを取得

Android: Firebaseの鍵ファイルを取得
■鍵ファイルとサーバーキーについて Firebaseで対象のプロジェクトで、「プロジェクトの概要」の隣にある歯車アイコンから「プロジェクトの設定」をクリック。 設定画面に遷移するので、タブメニューから「Cloud Messaging」をクリック。 ここで「サーバーキー」の値を確認する…だったが、「Cloud Messaging API(レガシー)」と表示されて「無効」になっている。 これは、AWSから「[No Action Required] Reminder to register SMS Sender ID for Singapore」という件名で告知があったもの。 > このメッセージを受信しているのは、過去90日間にAmazon SNSを使用してアカウントから1つ以上のモバイルプッシュ通知を送信したためです。 > 2023年6月21日、Google は、レガシー Firebase Cloud Messaging (FCM) API を使用しているアプリケーションは、2024年6月20日以降、モバイルプッシュ通知を送信できなくなると発表しました。 > 弊社では、このお知らせを承知しており、Amazon SNS経由での通知送信機能が中断されないよう、代替手段の提供に取り組んでおります。 > 新しいFCM APIを使用できるようになりましたら、ご連絡いたします。 2024年6月1日以降は、サーバキーでのプッシュ通知送信ができなくなる。 サーバキーではなく鍵ファイルを発行して、それをもとにGoogle_clientを使って送信する…という方式に変更する必要がある。 ただし送信プログラムも複雑になるため、可能ならAmazonSNSを使っての送信にすると良さそう。 [アップデート] Amazon SNS の FCM を使ったプッシュ通知がトークンベースの HTTP v1 API をサポートしたので、レガシー FCM API から移行してみた | DevelopersIO https://dev.classmethod.jp/articles/sns-fcm-http-v1-api-mobile-notifications/ ■鍵ファイルの発行 [アップデート] Amazon SNS の FCM を使ったプッシュ通知がトークンベースの HTTP v1 API をサポートしたので、レガシー FCM API から移行してみた | DevelopersIO https://dev.classmethod.jp/articles/sns-fcm-http-v1-api-mobile-notifications/ Firebaseで対象プロジェクト → プロジェクトの設定 → Cloud Messaging 「Cloud Messaging API」にサーバーキーが表示されていることを確認できる。 「Firebase Cloud Messaging API」には「サービス アカウントの管理」というリンクだけが表示されているのでクリック。 「プロジェクト「PushTest1」のサービス アカウント」という画面に遷移する。 一覧で「Firebase Admin SDK Service Agent」に対して「キーがありません」と表示されている列があるので、「… → 鍵を管理」をクリック。 鍵の作成画面に遷移するので、「鍵を追加 → 新しい鍵を作成」をクリック。 キーのタイプとして「JSON」と「P12」を選択できるが、今回は「JSON」を洗濯して「作成」をクリック。 pushtest1-aeb26-c00a0b10addc.json というファイルがダウンロードされた。 内容は以下のとおり。
{ "type": "service_account", "project_id": "pushtest1-aeb26", "private_key_id": "c00a0b10ad00000000000000000000baebe01a4f", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnoXNCLluQ4ikO\nY7mxImNS9ft4LFWCXDUqkPajWgMYwJzyLd〜中略〜hx0RWLhN9\n7mZwLUZfLvTKeCalOeDx61eCn4cnHRhpIukGzV4NdF1KwD+v3Jpo2Ot74/pGwSWl\nKUYqj6EYTMsXropj5TFXGg0=\n-----END PRIVATE KEY-----\n", "client_email": "firebase-adminsdk-ik32h@pushtest1-aeb26.iam.gserviceaccount.com", "client_id": "101260000000000064216", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-ik32h%40pushtest1-aeb26.iam.gserviceaccount.com", "universe_domain": "googleapis.com" }
なお鍵を作成した後も、先の「Firebase Cloud Messaging API」画面では「サービス アカウントの管理」というリンクだけが表示されている状態だった。 ■専用ツールから通知の送信 Firebase Cloud Messaging API(V1)でのPushテストの方法 #Android - Qiita https://qiita.com/ko2ic/items/d4001a3d246b7146e838 上記ページを参考に試す。 まずは以下にアクセスする。 OAuth 2.0 Playground https://developers.google.com/oauthplayground/ 「OAuth 2.0 Playground」が表示される。 左の一覧から「Firebase Cloud Messaging API v1」をクリックし、 さらに表示される「https://www.googleapis.com/auth/cloud-platform」をクリック。 チェックが付いたら、画面下にある「Authorize APIs」ボタンをクリック。 アカウントの選択を求められるので、開発に使用するアカウントを選択し、「Google OAuth 2.0 Playground」からのリクエストを許可する。 画面の右に「Request / Response」として以下が表示された。
HTTP/1.1 302 Found Location: https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foaut... GET /oauthplayground/?code=4/0AVG7fiSpC9M-LlpH2000000000000000000000000000000000cuotBvRbqzx5RSyZWMlw&scope=https://www.googleapis.com/auth/cloud-platform HTTP/1.1 Host: developers.google.com
次に画面の左で「Exchange authorization code for tokens」ボタンをクリック。 画面の右に「Request / Response」として以下が表示された。
HTTP/1.1 200 OK Content-length: 481 X-xss-protection: 0 X-content-type-options: nosniff Transfer-encoding: chunked Expires: Mon, 01 Jan 1990 00:00:00 GMT Vary: Origin, X-Origin, Referer Server: scaffolding on HTTPServer2 -content-encoding: gzip Pragma: no-cache Cache-control: no-cache, no-store, max-age=0, must-revalidate Date: Fri, 25 Oct 2024 03:25:23 GMT X-frame-options: SAMEORIGIN Alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-type: application/json; charset=utf-8 { "access_token": "ya29.a0AeD0000000000VXi3KrmXMexiZPq67qwtcpmLbCzZHCvHT0DHtGzS4DNFyBZpH9NQIO5pN0EV_FztYD_JinxSChoUiwXfPO-aIpKTj5FTQFvAEH8jMDdMDmW-YyutWgvmu4AM4-YLi0HJx_yqQ_WKLV3Wv-W3Zof7yMNRq_kaCgYKARkSARESFQHGX2MikQE7hU03dobDnoDfwS7o9g0175", "scope": "https://www.googleapis.com/auth/cloud-platform", "token_type": "Bearer", "expires_in": 3599, "refresh_token": "1//04Me3Hh0000000000ARAAGAQSNwF-L9Ir_q5RPTr_SXCv-a3yVX1bTyYch64HuSahgu4iGX2KD1_qQCZmpmFiqytTd0FJagdgFr0" }
次に画面の左で「HTTP Method」を「POST」にする。 さらに「Request URI」に以下を入力する。 https://fcm.googleapis.com/v1/projects/プロジェクトID/messages:send 今回の場合は以下のようになる。 https://fcm.googleapis.com/v1/projects/pushtest1-aeb26/messages:send 「Enter Request Body」をクリックすると、リクエスト内容の入力欄が表示される。 以下を入力する。(tokenの値には、送信先の端末のデバイストークンを設定する。以下はAndroid8に送信する場合。)
{ "message": { "token": "envzgXQ9Tm0000000000-K:APA91bFp66znOyBVMEkFCBRXhh-ssW2iQeDnXXKDGy-Ey-cN-T9FlaXFk0eKHlvfeYtoOYQjhqFN3WayxCtFwhZnOm48Mx99LIiXD2x7YQwZ8wwYw-X756tTgRAB1QvGDbdZBcp7_x69", "data": { "body": "You Got A Notification", "title": "You Got A Notification", } } }
画面下の「close」で入力欄を閉じる。 画面左にある「Send the request」ボタンを押すと、プッシュ通知が届いた。 画面右に以下が表示された。
POST /v1/projects/pushtest1-aeb26/messages:send HTTP/1.1 Host: fcm.googleapis.com Content-length: 331 Content-type: application/json Authorization: Bearer ya29.a0AeD0000000000VXi3KrmXMexiZPq67qwtcpmLbCzZHCvHT0DHtGzS4DNFyBZpH9NQIO5pN0EV_FztYD_JinxSChoUiwXfPO-aIpKTj5FTQFvAEH8jMDdMDmW-YyutWgvmu4AM4-YLi0HJx_yqQ_WKLV3Wv-W3Zof7yMNRq_kaCgYKARkSARESFQHGX2MikQE7hU03dobDnoDfwS7o9g0175 { "message": { "token": "envzgXQ9Tm0000000000-K:APA91bFp66znOyBVMEkFCBRXhh-ssW2iQeDnXXKDGy-Ey-cN-T9FlaXFk0eKHlvfeYtoOYQjhqFN3WayxCtFwhZnOm48Mx99LIiXD2x7YQwZ8wwYw-X756tTgRAB1QvGDbdZBcp7_x69", "data": { "body": "You Got A Notification", "title": "You Got A Notification", } } } HTTP/1.1 200 OK Content-length: 86 X-xss-protection: 0 X-content-type-options: nosniff Transfer-encoding: chunked Vary: Origin, X-Origin, Referer Server: scaffolding on HTTPServer2 -content-encoding: gzip Cache-control: private Date: Fri, 25 Oct 2024 03:31:12 GMT X-frame-options: SAMEORIGIN Alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-type: application/json; charset=UTF-8 { "name": "projects/pushtest1-aeb26/messages/0:1729827072841922%d7f69f40f9fd7ecd" }
■curlから通知の送信 「専用ツールから通知の送信」の手順中に取得したアクセストークンを使えば、curlコマンドでも送信することができる。
$ curl -X POST \ --header "Authorization: Bearer [アクセストークン]" \ --header "Content-Type: application/json" \ https://fcm.googleapis.com/v1/projects/[プロジェクトID]/messages:send -d " \ { \"message\": {\"token\":\"[FCM_TOKEN]\", \"data\":{\"body\": \"You Got A Notification\", \"title\": \"You Got A Notification\"}}}"
具体的には以下のようになる。
$ curl -X POST \ --header "Authorization: Bearer ya29.a0AeDClZAHyP3eyVXi3KrmXMexiZPq67qwtcpmLbCzZHCvHT0DHtGzS4DNFyBZpH9NQIO5pN0EV_FztYD_JinxSChoUiwXfPO-aIpKTj5FTQFvAEH8jMDdMDmW-YyutWgvmu4AM4-YLi0HJx_yqQ_WKLV3Wv-W3Zof7yMNRq_kaCgYKARkSARESFQHGX2MikQE7hU03dobDnoDfwS7o9g0175" \ --header "Content-Type: application/json" \ https://fcm.googleapis.com/v1/projects/pushtest1-aeb26/messages:send -d " \ { \"message\": {\"token\":\"envzgXQ9Tm0000000000-K:APA91bFp66znOyBVMEkFCBRXhh-ssW2iQeDnXXKDGy-Ey-cN-T9FlaXFk0eKHlvfeYtoOYQjhqFN3WayxCtFwhZnOm48Mx99LIiXD2x7YQwZ8wwYw-X756tTgRAB1QvGDbdZBcp7_x69\", \"data\":{\"body\": \"You Got A Notification\", \"title\": \"You Got A Notification\"}}}"
実行すると以下の結果が返され、プッシュ通知が届いた。
{ "name": "projects/pushtest1-aeb26/messages/0:1707468192965283%d7f69f40f9fd7ecd" }
同じアクセストークンでさらにプッシュ通知を送信できるが、この値は一定期間で失効してしまう。 しばらくしてから試すと、以下のエラーが返されるようになった。
{ "error": { "code": 401, "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", "status": "UNAUTHENTICATED" } }
この場合、上に記載の手順で再度アクセストークンを取得すればいい。

Advertisement