Evento promovido pela Digital Innovation One - DIO, com patrocínio da Amazon Web Services - AWS.
Adicionando Segurança em APIs na AWS através do Cognito.
Utilizar o AWS Cognito para oferecer autenticação, autorização e gerenciamento de usuários que acessam uma API. Etapas a serem observadas:
- Utilizar os serviços Amazon Cognito, DynamoDB, API Gateway e AWS Lambda;
- Criar uma API REST no Amazon API Gateway;
- Criar tabela no Amazon DynamoDB;
- Criar funções no AWS Lambda;
- Integrar o API Gateway com o Lambda back-end;
- Utilizar a ferramenta no POSTMAN;
- Criar um autorizador do Amazon Cognito para uma API REST no Amazon API Gateway.
A API utilizada neste projeto foi implementada utilizando o Serverless Framework e consiste na criação de uma tabela no DynamoDB e funções Lambda, integradas ao API Gateway para realizar operações sobre a tabela (inserir item, consultar, atualizar e deletar).
A criação de toda a infraestrutura da API é automática e foi baseada no projeto que desenvolvi neste repositório. Se desejar trocar o nome/tema da tabela, renomeie o nome da tabela Paises e de sua chave Pais, no arquivo serveless.yml e nas funções python da pasta src, para os nomes que desejar.
Requisitos:
- Criar (ou possuir) uma conta na AWS;
- Serverless Framework instalado (tutorial oficial aqui);
- AWS-CLI instalado e configurado com as credenciais da conta (Access Key e Secret Key) na AWS. Para mais informações, clique aqui;
- Instalar o Postman para interação com as rotas da API.
Para realizar o deploy da API na AWS, clone este repositório e acesse a pasta raiz pelo terminal. Digite:
serverless deploy
Se a estrutura de serviços for construída com sucesso em sua conta da AWS, será exibido no terminal uma mensagem como a mostrada abaixo, onde são listados os endpoints criados para cada método/operação no banco de dados.
Os links mostrados na imagem são apenas exemplos e não estão mais disponíveis.
A manipulação da tabela criada pode ser feita através do Postman, conforme exemplificado aqui, mas respeitando o nome da chave primária (neste projeto, "Pais"). Como o DynamoDB é NoSQL, não é necessário que todos os registros da tabela tenham os mesmos atributos - o único campo obrigatório é a chave primária (partition key).
Para implementar autenticação e gerenciamento de usuários no acesso à API é possível criar um autenticador (user pool) no Cognito. O passo a passo está documentado neste pdf.
Em seguida, é necessário fazer a integração da user pool criada com a API criando um autorizador no API Gateway e o vinculando aos métodos que terão restrição de acesso, conforme exemplificado nas imagens abaixo:
Com o autorizador vinculado, refaça o deploy da API clicando no botão Actions. A partir de então, o API Gateway não mais permitirá que um usuário insira novos dados na tabela, sendo necessário que ele antes se cadastre no Cognito.
Para ter acesso novamente à API, é necessário gerar um token de acesso no Postan. A imagem abaixo mostra um exemplo de como os campos devem ser preenchidos os dados configurados na criação da user pool no Cognito.
Para concluir a geração do token de acesso, será necessário cadastrar um usuário no Cognito, informando um email e uma senha (os critério para a definição da senha foram definidos na criação da user pool), e em seguida confirmando o código de verificação recebido no email:
Após o usuário ser validado, será concluída a geração do token no Postman. Copie o código gerado, e retorne à aba de POST em que a modificação na tabela havia sido bloqueada. Na seção Autorization da aba, selecione uma autenticação do tipo OAuth 2.0 e cole o token gerado na etapa anterior:
Enfim, tente outra vez inserir um novo registro na tabela. Como agora você é um usário autorizado, o Cognito irá permitir o acesso à API e será possível realizar alterações na tabela!