📮

Postmanで使うJWT(JSON Web Token)を自動で更新する

2023/02/10に公開

概要

Postman を使って、JWT(JSON Web Token)の認証のあるAPIをテストするときに、自動でJWTを更新する仕組みをつくったので、そのメモ

2024/10/31 追記 ✍️
Postman で認証情報を扱う、Vault がPre-requestから操作できるようになっていましたので、Vaultを使った方法に内容を更新しました。
また、非同期処理をCallback方式からPromiseを使った方法に書き換えました。

バージョン

Postman Version 11.18.2

手順

1. Collectionを作成する

Collectionsのタブから、Collectionを新規作成します。

create new collection

Collectionの作成は省略しても問題がありませんが、pre-request scriptsを再利用したいため、ここではCollectionを新規作成しています。

2. Pre-request Script を作成する

Collectionの Pre-request Script タブを選択します。

Pre-request Script に JWTの取得と設定をするスクリプトを追加します。

スクリプトには次の内容を追加します。

const atob = require("atob");

/**
 * JWTをパースする関数
 * @param {string} token - JWT
 * @returns {Object} JWTのペイロード
 */
function parseJwt(token) {
    const base64Url = token.split('.')[1];
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    const jsonPayload = decodeURIComponent(atob(base64).split('').map((c) => {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
    return JSON.parse(jsonPayload);
};

/**
 * JWTが有効かどうかを判定する関数
 * @param {string} token - JWT
 * @returns {boolean} 有効なJWTの場合Trueを返す。失効している場合はFalseを返す。
 */
function isValidToken(token) {
    if (!token) return false;
    const { exp } = parseJwt(token);
    if (!exp) return false;
    return new Date().getTime() < new Date(exp * 1000).getTime();
}

/* -- 以下、Postman vaultからJWTを取得して、有効なトークンがない場合は取得するコード -- */

const jwtKey = "token"; // このキー名でJWTがVaultに保存されます
const latestToken = await pm.vault.get(jwtKey);

if (isValidToken(latestToken)) return;

// 以下リクエストは使用する認証プロバイダーに合わせる
const password = await pm.vault.get("login-password");
const req = {
    url: '[your-token-provider-url]',
    method: 'POST',
    header: {
        'Content-Type': 'application/json',
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({ email: 'test@example.com', password })
    },
};

const response = await pm.sendRequest(req);
if (response.code !== 200) {
    console.error(response);
    return;
}

const { idToken } = response.json();
await pm.vault.set(jwtKey, idToken);

3. Vaultを設定する

Tokenを更新するための認証情報をVaultに設定します。

画面右下のVaultをクリックします。

Keyに login-password (←Pre-requestのリクエストで使用する値に合わせる)、 Value にパスワードなどの認証情報を設定します。

また、必要に応じて、この認証情報の使用を許可するドメインを設定します。

詳しくは次のドキュメントを閲覧ください
https://learning.postman.com/docs/sending-requests/postman-vault/postman-vault-key/

4. 認証情報を設定する

最後に認証情報の設定をします。

Collection > Authorization のタブに移動します。

次の設定をします。

  • Type: Bearer Token
  • Token: {{vault:token}} ←vault名を設定する[1]

使う

認証情報の自動更新を使うには、作成したCollectionから新規リクエストを作成するだけでOKです。

認証情報とPre-requestはCollectionから継承がされるため、Collectionに追加したリクエストには全て認証情報が自動で追加されます。

トラブルシューティング

認証の付与が正しく動作しない場合には、コンソールを開きます。

Pre-requestのログやエラーの内容が表示されるので、この情報を頼りにPre-requestやVaultの設定を修正します。

脚注
  1. https://learning.postman.com/docs/sending-requests/postman-vault/manage-vault-secrets/#use-vault-secrets ↩︎

Discussion