배경: Postman을 사용해서 API 테스팅을 자동화해야 하며 AWS Cognito에서 인증을 수행해야함.
- 애플리케이션에서 사용자를 인증하고 관련 토큰을 발행하기 위해 AWS Cognito를 사용함
- Postman에서 API 테스팅을 위해 AWS Cognito 인증(Authorization)을 수행해야함
- Postman의 API 테스팅은 자동화 되서 CI/CD에 연동해야함. 즉 AWS Cognito 인증 및 API 테스팅이 자동화 되어야함.
설정과정:
모든 API 테스트 과정을 자동화해야 하기 때문에 Pre-request Script를 활용.
Postman Pre-request Script:
var clientId = pm.environment.get(“cognitoClientId”);
var username = pm.environment.get(“cognitoUserName”);
var password = pm.environment.get(“cognitoUserPassword”);
pm.sendRequest({
url: “https://cognito-idp.ap-southeast-2.amazonaws.com/”,
method: ‘POST’,
header: {
‘X-Amz-Target’: ‘AWSCognitoIdentityProviderService.InitiateAuth’,
‘Content-Type’: ‘application/x-amz-json-1.1’
},
body: {
mode: ‘raw’,
raw: JSON.stringify({
“AuthParameters”: {
“USERNAME”: username,
“PASSWORD”: password
},
“AuthFlow”: “USER_PASSWORD_AUTH”,
“ClientId”: clientId,
}),
options: {
raw: {
language: ‘json’
}
}
}
}, function (error, response) {
console.log(response.json());
pm.environment.set(“cognitoAccessToken”, response.json().AuthenticationResult.AccessToken);
pm.environment.set(“cognitoIdToken”, response.json().AuthenticationResult.IdToken);
});
스크립트에 포함된 변수들은 Environments 탭에서 VARIABLE로 정의(define) 해두어야 하며 url 또한 자신의 환경에 맞게 설정해줘야 한다:
- cognitoClientId
- cognitoUserName
- cognitoUserPassword
- cognitoAccessToken
- cognitoIdToken
위의 스크립트를 실행하면 AWS Cognito의 AccessToken을 획득할 수 있다. 해당 AccessToken을 API 요청의 Authorization 헤더에 포함시켜 전송하면 성공적인 결과를 얻을 수 있다.
트러블 슈팅:
Postman Pre-request Script 실행 과정에서 발생한 에러:
{“__type”:”InvalidParameterException”,”message”:”USER_PASSWORD_AUTH flow not enabled for this client”}
메시지에 나온 것처럼, “USER_PASSWORD_AUTH flow not enabled for this client” 에러는 AWS Cognito에서 USER_PASSWORD_AUTH flow를 허용하지 않았기 때문에 나오는 에러이다.
AWS Cognito에서 USER_PASSWORD_AUTH flow를 활성화(enable) 해주면 해결된다.
AWS Cognito에서 USER_PASSWORD_AUTH flow 활성화 방법:
AWS 콘솔에 로그인 한 후 AWS Cognito로 이동해서 App integration -> App client list -> App client information(Edit)-> ALLOW_USER_PASSWARD_AUTH를 활성화 해주면 된다
USER_PASSWORD_AUTH란:
USER_PASSWORD_AUTH – Non-SRP authentication flow; USERNAME and PASSWORD are passed directly. If the USERNAME is not found in the user pool and a user migration Lambda trigger is set, this flow will invoke the user migration Lambda function.
참고: