📮
Postmanで使うJWT(JSON Web Token)を自動で更新する
概要
Postman を使って、JWT(JSON Web Token)の認証のあるAPIをテストするときに、自動でJWTを更新する仕組みをつくったので、そのメモ
手順
1. Collectionを作成する
Collectionsのタブから、Collectionを新規作成します。
Collectionの作成は省略しても問題がありませんが、pre-request scriptsを再利用したいため、ここではCollectionを新規作成しています。https://learning.postman.com/docs/writing-scripts/pre-request-scripts/#re-using-pre-request-scripts
2. Pre-request Script を作成する
Collectionの 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や環境変数の設定を修正します。
Discussion