
이전 실습 의 연장선입니다.
API 게이트웨이에 접근제한을 3가지 적용해보기
1. POST 전용으로만 작동하게 만들기
2. API 키를 이용한 인증 추가하기
3. 권한 부여자를 이용한 인증 부여하기 (토큰 기반)

ANY 를 제거한다. (ANY: 모든 메서드 (CRUD)를 의미함)
POST 를 추가한다.

API 배포 를 한다.

람다 페이지로 이동하여 ENDPOINT 확인 
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 키 의 사용 계획 생성



API 키값을 넣지 않고 요청해봄. 정상적으로 접근 금지됨 을 확인함.
 ❯ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0결과:
  {"message":"Forbidden"}API 키 값 복사 
API 키를 추가하여 테스트 진행함. 정상적으로 접근이 됨 을 확인함.
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;
}코드 편집기에 복사한 코드를 넣은 뒤 배포 (Deploy)  

allow  를 입력해서 정상동작하면 작동되는 것임allow 인 이유: 이전에 복붙한 람다 코드에서 그렇게 정의하였기 때문임 
Authrization 에 만들었던
auth가 조금 늦게 나올 수 있다. 최대 5분간 기다려야 나올 수 있다.


$ 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!"}