Postmanで使うJWT(JSON Web Token)を自動で更新する
概要
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を新規作成します。
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 にパスワードなどの認証情報を設定します。
また、必要に応じて、この認証情報の使用を許可するドメインを設定します。
詳しくは次のドキュメントを閲覧ください
4. 認証情報を設定する
最後に認証情報の設定をします。
Collection > Authorization のタブに移動します。
次の設定をします。
- Type:
Bearer Token
- Token:
{{vault:token}}
←vault名を設定する[1]
使う
認証情報の自動更新を使うには、作成したCollectionから新規リクエストを作成するだけでOKです。
認証情報とPre-requestはCollectionから継承がされるため、Collectionに追加したリクエストには全て認証情報が自動で追加されます。
トラブルシューティング
認証の付与が正しく動作しない場合には、コンソールを開きます。
Pre-requestのログやエラーの内容が表示されるので、この情報を頼りにPre-requestやVaultの設定を修正します。
Discussion