📮

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

2023/02/10に公開

概要

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

手順

1. Collectionを作成する

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

create new collection

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

2. Pre-request Script を作成する

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

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

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

/**
 * 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();
}

/**
 * トークンを環境変数に設定する関数
 * @callback setTokenCallback
 * @param {string} token - JWT
 * @returns {void}
 */

/**
 * 最新のJWTを取得する関数
 * @callback refreshCallback
 * @param {setTokenCallback} setToken - トークンを環境変数に設定するコールバック関数
 * @returns {void}
 */

/**
 * JWTを環境変数に設定する関数。
 * 環境変数に設定されたJWTが失効していた場合は、トークンを更新して再設定する
 * @param {string} envKey - 環境変数名
 * @param {refreshCallback} refreshFunc - JWTが失効していた場合に呼ばれる、トークンを更新するコールバック関数
 */
function setJwtEnv(envKey, refreshFunc) {
    if (!envKey || !refreshFunc) return console.error("Argument is required");
    const latestToken = pm.environment.get(envKey);
    if (!isValidToken(latestToken)) {
        refreshFunc((token) => pm.environment.set(envKey, token));
    }
}

/* -- 以下、認証プロバイダに合わせて適宜変更する -- */

// トークン更新するリクエストの内容
const req = {
    url: '[your-token-provider-url]',
    method: 'POST',
    header: {
        'Content-Type': 'application/json',
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({ email: pm.environment.get("email"), password: pm.environment.get("password") })
    },
};
// トークンを更新する
setJwtEnv("token", (setToken) => {
    pm.sendRequest(req, (error, response) => {
        if (error) return console.error(error);
        if (response.code !== 200) return console.error(response);
        const { idToken } = response.json();
        if (idToken) {
            setToken(idToken);
        }
    });
});

3. 環境変数を設定する

環境を新規作成します。

環境変数を追加します。

  • ここではPre-request Scriptで使用する、 token, email, password の環境変数を追加します。
  • 環境変数のタイプには secret を設定します。[1]
  • token の値は空のまま、email, passward などの認証に必要な情報は CURRENT VALUE に設定します。

4. 認証情報を設定する

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

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

次の設定をします。

  • Type: Bearer Token
  • Token: {{token}} ←環境変数名を設定する[2]

使う

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

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

トラブルシューティング

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

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

脚注
  1. (https://learning.postman.com/docs/sending-requests/variables/#variable-types) ↩︎

  2. https://learning.postman.com/docs/sending-requests/variables/#using-variables ↩︎

Discussion