SDKを使わずにPostmanだけでFCMのPush通知のテスト送信をしてみる（OAuth2対応）

# はじめに
**この記事で紹介するもの**

- Postmanの設定
- GoogleAPIの認証設定

**この記事で紹介しないもの**

- Firebaseプロジェクトの作成
- アプリ側プッシュ通知の受信設定


# 背景

**以前の`FCM HTTP API`**
サーバーキーを使い回したプロトコル。
　→ サーバーキーが漏洩した場合、キーを変えない限り悪用され続ける。
![スクリーンショット 2021-09-08 10.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/5cf198b5-3360-8cd8-bc79-0381fd476a00.png)

**これからの`HTTP v1 API`**
OAuth2 セキュリティ モデルに準じたよりセキュアなプロトコル。
　→ アクセストークンが漏洩した場合、悪用される時間は１時間程度。
![スクリーンショット 2021-09-08 10.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/713741af-c546-a9a6-6424-50958b1ca395.png)

`FCM HTTP API`から`HTTP v1 API`に以降した際、以前はサーバーキーを使い回してPostmanでPush通知の確認していましたが、これからはアクセストークンを取得してヘッダーに差し込む作業が必要になりました。

公式にAdmin SDKを利用してアクセストークンを取得する方法[サンプルコード](https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=ja#use-credentials-to-mint-access-tokens)が紹介されていました。
<details><summary>サンプルコード(nodejs)</summary><div>

```javascript
 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

```

</div></details>

しかし、Push通知のテスト送信をするために言語の導入やソースコードの管理が増えてしまうのは、使い勝手が悪いなと感じました。

本記事は

- 言語の導入不要!
- SDKを使用したサンプルコード不要!

Postmanのみで完結する設定方法の紹介となります。

#導入

**前提条件**

- Firebaseプロジェクトが作成済み
- サービス アカウント用の[秘密鍵ファイル](https://firebase.google.com/docs/admin/setup?authuser=0#initialize-sdk)を取得済み

**導入の流れ**

1. GoogleAPI OAuth同意画面の作成
1. Postman Authorizationの設定

## 1. GoogleAPI OAuth同意画面の作成
まずはOAuth同意画面に遷移します。
Firebaseコンソールより　「プロジェクトの設定」 > 「サービス アカウント」 > 「サービス アカウント権限の管理」

![スクリーンショット 2021-09-08 13.40.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/ca0a1737-8fb1-dd3a-3a9b-06f4c9bab6bc.jpeg)

GCPに遷移したらメニューより「APIとサービス」>「OAuth 同意画面」
![console.cloud.google.com_iam-admin_serviceaccounts_authuser=0&project=a76spa-toinx-dev.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/83cdf2ca-65b5-5d4e-11b8-b489575512bf.jpeg)

### ① OAuth同意画面
User Type「外部」を選択して「作成」
![スクリーンショット 2021-09-08 11.42.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/66f8712b-c301-cf79-d8a4-db86fd93f4b2.jpeg)

認証済みドメインに「getpostman.com」を追加 > 「保存して次へ」
![console.cloud.google.com_apis_credentials_consent_edit;newAppInternalUser=false_authuser=0&project=shiftwork-mobile-app (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/f3c37380-2680-f696-3d9a-331a3d391d3b.jpeg)

ちなみに、「ユーザーサポートメール」は後述で出てくる同意画面でアクセス拒否された場合に、「管理者にお問い合わせください（メールアドレス）」の表示で利用されるものになります。

### ② スコープ

1. 「スコープを追加または削除」
1. フィルタに`Firebase Cloud Messaging API` で絞り込む
1. `Firebase Cloud Messaging API` にチェックをつける
1. 「更新」

![スクリーンショット 2021-09-08 13.28.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/93e1295b-e984-0f9b-bf80-0e6e36f43cec.jpeg)

非機密のスコープに追加されたら、「保存して次へ」
![スクリーンショット 2021-09-08 13.29.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/84253f9c-3470-4110-ca33-298e84f8201b.jpeg)

### ③ テストユーザー
Postmanでアクセストークンを取得する際にGCPにログインするユーザーを登録します。（※上限100人）

1. 「ADD USERS」
1. テスト送信するユーザーのメールアドレスを登録
1. 「追加」

![スクリーンショット 2021-09-08 13.30.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/a7050a37-b6a3-f036-be9d-648aacf94bcf.jpeg)

テストユーザーを追加したら「保存して次へ」
![console.cloud.google.com_iam-admin_serviceaccounts_authuser=0&project=a76spa-toinx-dev (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/0049a664-0960-2c59-3aa0-d58c39910664.jpeg)

### ④ 概要
「ダッシュボードに戻る」
![console.cloud.google.com_apis_credentials_consent_edit;newAppInternalUser=false_authuser=0&project=shiftwork-mobile-app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/292d9c3e-aeb5-1ee9-8ee7-9d01c07de09b.jpeg)

### ⑤ 認証情報の取得
Postmanからアクセスする際の認証情報を取得します。
左メニューの認証情報より OAuth2.0 クライアントIDのうち 「Web Client」の編集ボタンを押します。
![console.cloud.google.com_apis_credentials_consent_edit;newAppInternalUser=false_authuser=0&project=shiftwork-mobile-app (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/27c4bd4a-e48f-4a27-5a40-b56630c70adf.jpeg)

以下の情報を控えてください。

- ① クライアントID
- ② クライアント シークレット
- ③ 承認済みのリダイレクトURI

![console.cloud.google.com_apis_credentials_consent_edit;newAppInternalUser=false_authuser=0&project=shiftwork-mobile-app (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/7df36470-65e7-4db0-f0a2-6982ce95e2c4.jpeg)

# 2. Postman Authorizationの設定

Postmanを起動し、コレクションの「Authorization」を開きます。
![スクリーンショット 2021-09-08 16.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/cb105f58-5df3-fbde-e04e-010d9e009638.png)

### Authorizationの設定
トークン取得時の認証情報を設定します。

- Type: OAuth 2.0
- Callback URL: ③承認済みのリダイレクトURI
- Auth URL: `https://accounts.google.com/o/oauth2/auth`
- Access Token URL: `https://oauth2.googleapis.com/token`
- Client ID: ①クライアントID
- Client Secret: ②クライアント シークレット
- Scope: `https://www.googleapis.com/auth/firebase.messaging` ← [MESSAGING_SCOPE](https://github.com/firebase/quickstart-nodejs/blob/2d93fcde1795a4213c69137b83da392bb8aee462/messaging/index.js#L15
)

![スクリーンショット 2021-09-08 16.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/12d954ac-82cd-6b4e-92ec-a77b8aed429b.png)
![スクリーンショット 2021-09-08 16.10.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/5efa3455-5009-c5a9-027b-c88c66fc5f84.jpeg)
![スクリーンショット 2021-09-08 16.23.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/28037068-c8da-cbbc-2868-38f4670acb51.jpeg)

### アクセストークンの取得
上記の「Get New Access Token」を押します。
すると、Googleのログイン画面がポップアップしますので、前述で登録したテストユーザーでログインします。
![スクリーンショット 2021-09-08 16.16.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/df518864-8574-6a64-ea2f-3e99cc3b957e.jpeg)

権限周りの許可を求めてくるので許可をするとアクセストークンを取得することができます。
![スクリーンショット 2021-09-08 16.18.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/9984c6c3-0b8f-6b29-c903-4eea6830c3a1.jpeg)

Access TokenのAvailable Tokensより「googleapi-oauth2」を選択すると、アクセストークンの反映が完了します。
![スクリーンショット 2021-09-08 16.34.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/516ab46d-3896-987c-24aa-cfdbe1912a57.jpeg)

### 確認
各リクエストのHeadersを確認すると、既に`hidden header`に`Authorization: Bearer ya29...`とアクセストークンが反映されていることが確認できます。
![スクリーンショット 2021-09-08 16.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/e6066287-375b-ab13-2f97-9f9a40f16b5c.png)

無事、Push通知の送信に成功しました。
![スクリーンショット 2021-09-08 17.49.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/003ebc30-c15a-98da-fe89-0d80aef327a6.jpeg)


# 補足
テストユーザーに追加していないアカウントでログインすると、権限がなくエラーとなります。
この時、前述で登録したユーザーサポートメールに問い合わせる旨のメッセージが表示されます。
![スクリーンショット 2021-09-08 17.24.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104642/59ac05b9-1b83-f827-6228-0bf0a79549a5.jpeg)

# 終わりに
SDKを使うという手間を省いてみたけれども、テストユーザーの追加というプロセスが増えたので、テスターが変わったらテストユーザーのアカウントを追加するといった管理が新たに発生しました。

使い勝手が良くなったかどうかは...:thinking: