Postman APIを活用して環境変数のInitial Valueを動的に更新してみた

# はじめに
本記事はPostman Advent Calendar 2024の16日目の記事です。

https://qiita.com/advent-calendar/2024/postman

今回は、Postman APIを活用して環境変数のInitial Valueを動的に更新する方法について紹介します。

# 背景
PostmanのCLIツールであるNewmanでは、環境変数を指定して実行する際に、環境変数のCurrent ValueではなくInitial Valueが参照されます。

認証にOAuth2.0を使用している場合、Current Valueに有効なアクセストークンを動的に更新し続けることで、常に認証が成功するように設定することができます。

しかし、CLIツールであるNewmanを利用する場合、環境変数のInitial Valueを参照して実行するため、Current Valueのトークンがリフレッシュできても、Initial Valueが参照されるため認証エラーになります。

Postman APIを活用することで、動的に環境変数のInitial Valueを更新し、認証エラーが発生しないようにしたいと思います。

Postman APIを活用することで動的に環境変数のInitial Valueを更新し、認証エラーが発生しないようにしたいと思います。

# 前提
Postmanには、OAuth2.0のアクセストークンを自動でリフレッシュする便利な機能があります。

https://qiita.com/yokawasa/items/b4d89d983bfd23792788

しかし、Newmanではこの機能がサポートされていないため、Postmanのリクエストに直接アクセストークンをリフレッシュする処理を追加する必要があります。

https://qiita.com/yokawasa/items/f92b2fc5fcff47856912

本記事はアクセストークンを自動更新する処理を実装した後にNewmanからの実行でもアクセストークンを自動で更新する方法の記事になります。

# Postman APIを活用して環境変数のInitial Valueを更新する
Postmanの公式サイトには、環境変数のInitial Valueを動的に設定する方法が紹介されています。

https://support.postman.com/hc/en-us/articles/11532548145303-How-to-dynamically-set-the-initial-value-for-a-variable

以下のエンドポイントを使用してリクエストを作成します。

 ```エンドポイント.
 [PUT] https://api.getpostman.com/environments/{{environmentId}}
```

環境変数IDは、環境変数画面の右にあるInformationボタンをクリックすると表示されます
![スクリーンショット 2024-12-16 13.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385025/852748a7-410e-9ca5-189e-a1916c076fa9.png)


作成したリクエストのPre-request Scriptタブで、現在のトークンの値を取得して変数に格納します。
```Pre Request.
const access_token = pm.environment.get("access_token");
const refresh_token = pm.environment.get("refresh_token");
```

次に、リクエストボディを書いていきます。

nameには使用する環境変数の名前を入れます。
keyには更新したい値のキーを入れます。
valueにはそのキーのInitial Valueに入れたい値を入れます。
Pre-request Scriptに追加した処理によって、リクエストを送信する前にトークンの変数に有効なトークンの値がセットされます。

以下のようにリクエストボディを書いて、有効なトークンの値をInitial Valueに代入します。

```リクエストボディ.
 {
     "environment": {
         "name": "使用する環境変数の名前",
         "values": [
             {
                 "key": "環境変数の中にある変数名",
                 "value": "更新したい値",
                 "enabled": true
             }, {
                 "key": "access_token",　//Current valueの値をInitial Valueに代入する
                 "value": "{{access_token}}",  //Current valueの値
                 "enabled": true
             }, {
                 "key": "refresh_token", 
                 "value": "{{refresh_token}}",
                 "enabled": true
             }
         ]
     }
 }
```

# Newmanを実行してみよう
環境変数のInitial Valueを更新する仕組みが完成したので、Newmanを実行してみます。

### 使用するコレクション
* リクエストA
    * 簡単なテストが書かれたリクエスト
    * Pre-request Scriptタブにアクセストークンの自動更新の処理を実装

* リクエストB
    * Postman APIで環境変数のInitial Valueを更新するリクエスト

今回はNewmanを実行するときに、ファイルではなくURLを指定して実行します。

### コレクションのURLの取得の方法について
1. 対象のコレクションの3点ボタンから「Share」をクリックします
![スクリーンショット 2024-12-16 15.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385025/5bb2249e-bc17-ab7e-5e33-ae4730e320f4.png)

2. 表示されるモーダルから「Share Via API」をクリックし、APIキーを生成して、表示されるURLをコピーします
![スクリーンショット 2024-12-16 15.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385025/6362014f-d28b-7c48-0265-c4347c0457f5.png)


### 環境変数のURLの取得方法について
1. 以下のエンドポイントを使用します
   ```[GET] https://api.getpostman.com/environments```
2. environments/の後に環境変数IDとAPIキーを指定します
![スクリーンショット 2024-12-16 15.21.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385025/d52ceb64-8810-a133-75b8-4db315acfea8.png)
3. APIキーはコレクションのURL取得時に生成したものを使用してください
3. リクエストを送信して環境変数の情報が取得できればOKです


### Newmanの実行
newman runの後に取得したコレクションのURLを指定し、環境変数を指定する場合は-eオプションで取得した環境変数のURLを指定して実行します。

```newman run "https://..." -e "https://..."```


Postman APIを使用して常に有効なトークンをInitial Valueに設定することができたため、どのタイミングでNewmanを実行しても認証エラーが発生しなくなりました。
![スクリーンショット 2024-12-16 15.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385025/66f613ba-6b1b-287c-5701-0849d620c604.png)


# 最後に
今回はPostman APIの一部のエンドポイントを使用して環境変数のInitial Valueを動的に更新する方法について紹介しました。

NewmanでもPostman APIを活用することによってOAuth2.0のトークンリフレッシュを実現できました。同じようにNewmanやOAuth2.0を活用されている方の参考になれば幸いです。