En post anteriores comentaba las posibilidades que ofrece AWS sam para probar localmente nuestras Apis Con Dynamo DB y Generando Logs Localmente.
En la última actualización de AWS sam 02-04-2023, se agregó una interesante funcionalidad,la posibilidad de probar localmente los Authorizer que se tengan configurados en los ApiGateway.
En el siguiente repositorio de GitHub https://github.com/olcortesb/sam-api-authorizer he dejado una demo completa de como probar los Authorizer localmente.
A continuación dejo algunos detalles adicionales
Actualizar la versión de AWS sam:
La versión a partir de la cual esta funcionalidad está disponible es la 1.80.0
Para verificar la versión que tenemos instalada y actualizar:
sam --version
# SAM CLI, version 1.76.0
# For mac
brew upgrade aws-sam-cli
sam --version
# SAM CLI, version 1.81.0
Como actualizar AWS sam Para distintos sistemas operativos:
Código e infraestructura
Dentro del proyecto se encontrarán tres archivos que son los principales:
- template.yaml -> Definición de la infraestructura (Api y lambdas) 
- authorizer.js -> La lambda que contiene el Custom authorizer 
- handler.js -> la lambda que esta detrás del Api Gateway y el Authorizer. 
Definiendo el Authorizer dentro de la API
# File template.yaml
Resources:
  LoggerApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      Auth:
        DefaultAuthorizer: JWTCustomAuthorizer
        Authorizers: # Definitions of authorizer
          JWTCustomAuthorizer:
            FunctionPayloadType: TOKEN
            FunctionArn: !GetAtt JWTAuthFunction.Arn
Definiendo la lambda que se ejecutara para validar el Authorizer tipo TOKEN
# File template.yaml
  JWTAuthFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: authorizer.lambdaHandler
      Runtime: nodejs18.x
      CodeUri: .
      Architectures:
        - x86_64
Código de lambda basada en él template que provee aws: Link
⚠️ No usar en producción, remplazar por la validación del JWT correspondiente.
// File authorizer.js
const validate_token_and_user = async (token)=>{
    // Validate token Demo
    // Do not use in productive environment
    // valide your token here
    console.log("Log from lambda authorizer ...");
    console.log("The token: ",token);
    if (token.split(' ').pop() === 'e81a50b9'){
        return true;
    }
    return false;
}
Levantar el proyecto en local
Descargar el proyecto del repositorio: https://github.com/olcortesb/sam-api-authorizer
Ahora levantamos las APIs
sam local start-api -p 3002 --log-file logfile.txt
Llamamos al endpoint /logger
Probamos pasando el token errado …
curl -X GET \
  'http://127.0.0.1:3002/logger' \
  --header 'Accept: */*' \
  --header 'Authorization: Bearer e81a50b9ddd'
# Response:
# { 
# "message": "User is not authorized to access this resource"
# }
Y pasando el token correcto
curl -X GET \
  'http://127.0.0.1:3002/logger' \
  --header 'Accept: */*' \
  --header 'Authorization: Bearer e81a50b9'
# Response
# "OK"
Finalmente, utilizando la funcionalidad de generar un log localmente como si fuera AWS CloudWatch (Link), podemos ver los logs que hemos dejado dentro de la lambda Authorizer.
START RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128 Version: $LATEST
2023-04-24T13:05:22.621Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Method ARN: arn:aws:execute-api:us-east-1:123456789012:1234567890/dev/GET/logger
2023-04-24T13:05:22.627Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Token fron event: Bearer e81a50b9
2023-04-24T13:05:22.628Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Log from lambda authorizer ...
2023-04-24T13:05:22.628Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO El token: Bearer e81a50b9
END RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128
REPORT RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128 Init Duration: 1.69 ms Duration: 1523.58 ms Billed Duration: 1524 ms Memory Size: 128 MB Max Memory Used: 128 MB
¡Eso es todo por ahora, espero sea útil, gracias!
Saludos
 

 
                       
    
Top comments (0)