メモ > 技術 > サービス: 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"
}
}
この場合、上に記載の手順で再度アクセストークンを取得すればいい。