Postman allows us to specify an OAuth2.0 flow to get a JWT from the AWS Cognito user pool, but by default, it will use the access_token, and sometimes you need to use the custom attributes included in the id_token.
This post will help us automate getting the Cognito JWT id_token by using a pre-request script in postman.
The following pre-request script will:
- Validate if we want to refresh the token on every request. If not, it will use the stored token from a previous request
- Validate if the token is still valid by verifying the expiry timestamp.
- If the token is not good, it will request a new one and store it in an environment variable.
- If the token is still valid, it will simply reuse it for the request.
Source available on gist
const echoPostRequest = {
url: 'https://cognito-idp.us-west-2.amazonaws.com/',
method: 'POST',
header: {
'Content-Type' : 'application/x-amz-json-1.1',
'X-Amz-Target': 'AWSCognitoIdentityProviderService.InitiateAuth'
},
body: {
mode: 'application/json',
raw: JSON.stringify(
{
"AuthParameters" : {
"USERNAME" : pm.environment.get('credentialsUsername'),
"PASSWORD" : pm.environment.get('credentialsPassword')
},
"AuthFlow" : "USER_PASSWORD_AUTH",
"ClientId" : pm.environment.get('cognitoPoolClientId')
})
}
};
var fetchTokenOnEveryRequest = pm.environment.get('fetchTokenOnEveryRequest') ? (pm.environment.get('fetchTokenOnEveryRequest')==='true'):false;
var getToken = true;
if(!fetchTokenOnEveryRequest){
console.log('removing previous token')
pm.environment.unset('accessTokenExpiry')
}
if (!pm.environment.get('accessTokenExpiry') ||
!pm.environment.get('currentAccessToken')) {
console.log('Token or expiry date are missing')
} else if (pm.environment.get('accessTokenExpiry') <= (new Date()).getTime()) {
console.log('Token is expired')
} else {
getToken = false;
console.log('Token and expiry date are all good');
}
if (getToken === true) {
pm.sendRequest(echoPostRequest, function (err, res) {
console.log(err ? err : res.json());
if (err === null) {
console.log('Saving the token and expiry date')
var responseJson = res.json();
console.log(responseJson.AuthenticationResult.ExpiresIn)
pm.environment.set('currentAccessToken', responseJson.AuthenticationResult.IdToken)
if(fetchTokenOnEveryRequest){
var expiryDate = new Date();
expiryDate.setSeconds(expiryDate.getSeconds() + responseJson.AuthenticationResult.ExpiresIn);
pm.environment.set('accessTokenExpiry', expiryDate.getTime());
}
}
});
}
Required environment variables
The following variables are required to fetch the tokens:
Variable | Example | Description |
---|---|---|
cognitoPoolClientId | 123435356578 | Your cognito user pool clientId |
credentialsUsername | myCognitoUsername | The username to authenticate |
credentialsPassword | 1231%^PassW0rd | The password for the user name to authenticate |
fetchTokenOnEveryRequest* | true/false | Specify if you want to fetch a new token on every request. By setting it to true it will remove the accessTokenExpiry variable from the environment. |
fetchTokenOnEveryRequest Is optional, it will default to false if is not specified
Once you add the script and the variables, you'll be able to perform your requests and, if fetchTokenOnEveryRequest is set to false, you'll see a couple of variables holding the data of the last token:
Variable | Description |
---|---|
currentAccessToken | Previously generated token |
accessTokenExpiry | Timestamp with the token expiry |
Ensure to set {{currentAccessToken}} as a Bearer value in the authorization tab.

Update: 01/18/2022
I've fixed a wrong condition to save the expiry date