Postmanでログイン状態を維持する

## この記事でやること

1. アクセストークンをもらうためのAPIをPostmanで叩き、帰ってきたアクセストークンをPostmanの環境変数を利用して永続的に保存する。

2. 保存した値を、認証が必要なリクエストを送る前に動的にヘッダーにセットする。

## なにが嬉しいか

Postman[^1]がアクセストークンを保持できるので、ブラウザでいういわゆる「ログイン状態」を維持することができる。

[^1]: Postmanとは？ → API開発のさいに便利なデスクトップアプリケーション。詳しくは公式へ： https://www.postman.com/



## 手順

### 1. ログインAPI(アクセストークンをもらうためのAPI）のタブを開く

### 2. Testsの項目で、レスポンスヘッダーの値を受け取る。

Testsという項目は、<b>APIのレスポンスが帰ってきたあと</b>の処理をNode.jsベースでランタイムに書けるところ。一言で言えば、JavaScriptが書ける。

ヘッダーの値をPostmanの環境変数にセットする処理の例が以下。

![スクリーンショット 2020-03-14 19.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/35c494d7-c914-01f4-c6b5-6bca0ef4fc13.png)


```tests.js
const headers = responseHeaders
const ok = responseCode.code === 200

if (ok) {
    pm.globals.set('uid', headers.uid)
    pm.globals.set('client', headers.client)
    pm.globals.set('access-token', headers['access-token'])
}
```

このコードは、APIから帰ってきたレスポンスのヘッダーを取得し、それをPostman上の環境変数にセットするための記述です。

素直な処理なのでわかりやすいとは思いますが、以下だけ、PostmanSandboxAPI[^2]を利用している特殊な処理なので注意です。

[^2]: PostmanSandboxAPIとは？　→　Postman上で利用できるAPI。 詳しくは公式リファレンスへ。https://learning.postman.com/docs/postman/scripts/postman-sandbox-api-reference/

```js
pm.globals.set('uid', headers.uid)
```

これは一言でいえば、「Postmanの環境変数として、uidというプロパティ名で、レスポンスヘッダーのuidの値をセットします」ということです。



認証のために「uid」「client」「access-token」の三種類を利用しているアプリケーションの場合は、以下のように三種類に対する処理が必要となります。

```js
pm.globals.set('uid', headers.uid)
pm.globals.set('client', headers.client)
pm.globals.set('access-token', headers['access-token'])
```

### 3. Testsに記述後、APIをPostmanで叩く

リクエストボディに、ログインのための認証情報を入力して、Postする。

![スクリーンショット 2020-03-14 19.32.32![スクリーンショット 2020-03-14 19.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/4ace0e09-73bd-2f3a-40ad-bdce1bbf1f2e.png)
.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/8703cce8-e95d-e721-aa68-df238abab224.png)

### 4. レスポンスを受け取ったあと、環境変数としてアクセストークン等が保存されているかチェック

画面右上の歯車（画像でいう右側）をクリックして、
![スクリーンショット 2020-03-14 19.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/40627624-85c4-3106-7e85-2d50457dfdf8.png)


「Globals」に値が保存されていたらOK。

![スクリーンショット 2020-03-14 19.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/8fcbeb76-c977-7506-f7ab-33bd1cee6554.png)


### 5. Postmanの環境変数を、リクエスト前に送る

先程は、Testsという項目を利用して、レスポンス後にJavaScriptで処理を走らせたが、次は「Pre-request Scripts」という項目を利用し、リクエスト前にJavaScriptを走らせるよう記述する。

Pre-request Scriptsは、コレクション単位で設定できるので、コレクションの編集をしよう。コレクションというのは、複数のリクエストタブを一つにグルーピングしているものである。

まずは、「Edit」でコレクションの編集画面に移動する。

![スクリーンショット 2020-03-14 19.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/94645691-3c11-1fa7-1889-a810dee0d715.png)

その後、Pre-request Scriptsのタブに移動し、リクエスト前に行ってほしい必要な処理を記述する。

![スクリーンショット 2020-03-14 19.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/b4fa4d4b-8303-16d2-9589-3244f32b884b.png)


```js
// pm.globals.getで、引数に与えたプロパティ名の環境変数を取得する
const uid = pm.globals.get('uid')
const access_token = pm.globals.get('access-token')
const client = pm.globals.get('client')

// pm.request.headers.add で、リクエストのヘッダーに、任意のプロパティ名と値をセットできる。
pm.request.headers.add( {key: 'uid', value: uid })
pm.request.headers.add( {key: 'access-token', value: access_token })
pm.request.headers.add( {key: 'client', value: client })

```

これで、実質的にログイン状態を維持したまま、Postmanを利用することが出来る。