📮

StrapiのAuthリクエストをPostmanで行うときのTips

2020/12/08に公開

この記事は Strapi Advent Calendar 7日目の記事です
https://qiita.com/advent-calendar/2020/strapi

StrapiのAPIリクエストをPostmanでする際に幸せになれるTipsを紹介します。
https://www.postman.com/

api-client

Strapiで作成したAPIは、設定でAuth情報付きのリクエストのみ許可する権限を付けることができますが、APIへリクエストする際には auth/local で認証トークン jwt を取得してから、対象のAPIに認証情報(Bearer)を付けてリクエストしなければなりません。

数回のみのテストであれば、手作業でトークンを取得してHeaderにAuth情報を付けてリクエストする方法でも問題はないのですが、何十回と時間をおいたり日をまたいで行う場合にはとても面倒な作業になってくるため、この作業をもっと楽にする方法を以下で紹介します。

TL;DR

  • Postmanのenvironmentで auth/local のjwtを管理すると環境毎にトークンが管理できて楽
  • strapiの auth/local の認証をPostmanのpre-request機能で各APIのリクエスト前に行うと楽
  • 更にリクエストをまとめるディレクトリ自体のpre-requestに認証処理を入れると更に楽

environmentを準備

Postmanには、環境毎に変数を設定できる「environment」という機能があります。

https://learning.postman.com/docs/sending-requests/managing-environments/

このenvironmentに設定する値はリクエスト前後で動的に設定することができるので、それを利用して環境毎のトークンなどを管理します

environmentを作成

  • 画面右上の「Manage Environments」ボタンをクリック

  • 「Add」をクリック

  • Environment Nameに api-localのように環境変数名を入力し「Add」をクリック

  • Manage Environmentsダイアログを閉じる

  • 「Manage Environments」の左側にあるEnvironmentsのプルダウンから、先程追加したenvironmentを選択する(この例で言うと、api-localを選択する)

environmentの値を設定

先程追加したenvironmentに以下の値を追加します

VARIABLE INITIAL VALUE CURRENT VALUE
endpoint http://localhost:1337 http://localhost:1337
jwt
identifier (Strapiで作成したUserのemail)
password (Strapiで作成したUserのpassword)

この段階では、endpoint, identifier, passwordがINITIAL VALUE、CURRENT VALUEに入力されている状態にします

コレクションの作成

サイドメニューのCollectionsの「+ New collection」から、今回のAPI用のコレクションを作成します

リクエストの作成

作成したコレクションのオプションメニューから「Add request」を選択し、リクエストを作成します。

リクエスト名は任意でOKです

リクエスト内容を設定

今回はGETリクエストの内容を設定するので、URL部分に

{{endpoint}}/members と入力します。

これでSendをすると、environmentのendpointの値が適用されて

http://localhost:1337/members にリクエストをしてくれます。

しかし、APIはAuthの制限をしているため、レスポンスは403エラーとなります

pre-requestに認証処理を設定

さて、ここからがおまじない。

pre-reqタブに以下のスクリプトを入力します。

const endpoint = pm.environment.get('endpoint')
const identifier = pm.environment.get('identifier')
const password = pm.environment.get('password')

pm.sendRequest({
    url: `${endpoint}/auth/local`,
    method: 'POST',
    header: {'Content-Type':'application/json'},
    body: {
        mode: 'raw',
        raw: JSON.stringify({ 
            "identifier": identifier, 
            "password": password
        })
    }
}, function (err, res) {
    console.log(res.json());
    pm.environment.set('jwt', res.json().jwt)
});

これを追加することで、Strapiのauth/local apiに id/passの認証リクエストを行い、レスポンスのjwtの値をPostmanのenvironmentのjwtにセットする処理を、対象のAPIのリクエスト前に行ってくれるようになります。

試しにこの状態でリクエストをしてみると、APIへのリクエストは403のままですが、environmentのjwtにトークンの値が入っていることが確認できます。

(値が入っていない場合は、ID/Passが間違っている可能性があります)

Authの設定

最後にリクエストのAuth情報を設定します

Authタブを選択し、Typeを Bearer Token 、 Tokenに{{jwt}} を入力して準備完了です。

認証リクエストをする

これでAPIへリクエストをすると、毎回APIのリクエストの前に Strapiのauth/local で取得した認証トークンをリクエストヘッダーに付けてリクエストしてくれるようになります。

これが地味に便利!

environmentの切り替え

さて、ここからは応用編です

最初にPostmanのenvironmentに api-local というものをつくりました。

このenvironmentのは、ローカルマシンでの検証するための値を保持するために作りました。

環境を変更するには、endpointで設定したURLを環境毎に変えれば良いので、environmentを複製してendpointを書き換えてしまえばあっという間に異なる環境のデータセットができてしまいます。

あとはenvronmentのプルダウンから使いたい環境を選択すれば、環境の切り替えは完了です

ディレクトリに共通の認証処理を設定

Postmanには、リクエストをグループ化するディレクトリが存在しており、ディレクトリ自身にもPre-requestやAuth情報を設定することができます。

これがやばいんです。

例えば、menbersというディレクトリを作成して、ディレクトリにAuthとPreRequestを設定します。

そして、その配下に GET /membersPOST /membersGET /members/:idなどのリクエストを作成すると、

なんとディレクトリ配下にあるリクエストにAuthやPre-requestの情報が継承されます。

つまり、リクエスト毎にAuthの設定をしなくて済みます!

これがめっちゃ便利なので、ぜひお試しあれ。

Discussion