이전 실습 의 연장선입니다.
API 게이트웨이에 제한을 걸어서 권한이 있는 사용자만 접근이 가능하도록 설정할 수 있습니다.
람다의 게이트웨이에 접속한다.
기존 ANY
를 제거한다. (ANY: 모든 메서드 (CRUD)를 의미함)
POST
를 추가한다.
API 배포
를 한다.GET
로는 접속이 되지 않는 것을 확인curl https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
# 접속 실패
{"message":"Missing Authentication Token"}
POST
로 접속이 가능함을 확인curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
# 접속 성공
{"statusCode":200,"body":"OK!"}
API 키
가 필요하도록 변경API 키
생성API 키
의 사용 계획 생성 ❯ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
결과: {"message":"Forbidden"}
curl -X POST -H "x-api-key: 9mPTwyxSTD1oCYEcz****************" https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
결과: {"statusCode":200,"body":"OK!"}
export const handler = function(event, context, callback) {
var token = event.authorizationToken;
switch (token) {
case 'allow':
callback(null, generatePolicy('user', 'Allow', event.methodArn));
break;
case 'deny':
callback(null, generatePolicy('user', 'Deny', event.methodArn));
break;
case 'unauthorized':
callback("Unauthorized"); // Return a 401 Unauthorized response
break;
default:
callback("Error: Invalid token"); // Return a 500 Invalid token response
}
};
// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
var authResponse = {};
authResponse.principalId = principalId;
if (effect && resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17';
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval",
"numberKey": 123,
"booleanKey": true
};
return authResponse;
}
allow
를 입력해서 정상동작하면 작동되는 것임allow
인 이유: 이전에 복붙한 람다 코드에서 그렇게 정의하였기 때문임 $ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0 \
-H "x-api-key: 9mPTwyxSTD1oCYEczPoEl25khzi***" \
-H "authorizationToken: wrong-token"
{"message":null}
테스트 시의 헤더에 사용되는 x-api-key 는 API 키를 이용한 인증 추가하기 에서 진행했던 것을 그대로 사용하는 중임.
$ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0 \
-H "x-api-key: 9mPTwyxSTD1oCYEczPoEl25khziN844zEHsKcfK2" \
-H "authorizationToken: allow"
{"statusCode":200,"body":"OK!"}
참고자료 :