No artigo sobre o encurtador de url, configuramos o API Gateway pra servir como backend chamando uma função do AWS Lambda. O que não foi explicado no artigo, foi como fazer a segurança da API, pois conforme desenvolvemos, qualquer pessoa que conheça a URL, poderia utiliza-la.
O desenvolvimento desta camada de segurança consiste na criação de uma função lambda que vai funcionar como authorizer. Este conceito dentro do API Gateway refere-se a uma validação de segurança que será chamada assim que a requisição foi recebida pelo API Gateway. Caso a chamada não seja autorizada, a função url-shrink nem será chamada.
O gráfico abaixo demonstra esse comportamento
Caso tenha duvida na criação da função lambda ou do uso do api gateway, sugiro dar uma segurada e olhar o artigo sobre encurtamento de URL que explico sobre o uso de diversos serviços da AWS
Lambda Function
A criação do authorizer começa criando o código de autorização que será uma lambda function. Acesse o serviço de lambda function da AWS e crie uma nova função vazia.
O seu authorizer não precisa ser uma função lambda, pode ser utilizado o AWS Cognito também, mas isso é assunto para outro artigo.
Abaixo está o código da função para construção do authorizer utilizando nodeJS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | var key = "89cf5646c51e64ba2c1495bcce54f4dd" exports.handler = function(event, context, callback) { switch (event.authorizationToken) { case key: callback(null, generatePolicy('url-shrink', 'Allow', event.methodArn)); break; default: callback("Unauthorized"); } }; 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 = { "auth-status": "allowed" }; return authResponse; } |
O intuito do artigo não é explicar passo a passo o código em nodeJS, mas é necessario entender a logica desta função:
- na primeira linha informamos a chave que será utilizada como token. Neste artigo, a chave está fixa no código, você pode utilizar uma variável de ambiente lambda ou obter esse token de qualquer lugar que achar melhor, mas como trata-se de algo bem simples, vamos manter assim.
- na terceira linha, temos a função principal, que busca no header o valor da propriedade authorizationToken e verifica se o valor informado é igual ao valor da chave informada na primeira linha
- caso o token informado seja diferente, é retornado Unauthorized, que é o código http 401. Caso tudo esteja certo, é gerada uma policy da AWS e ela é retornada ao API gateway com as informações do que o usuário possui acesso.
- a chamada a função generatePolicy possui 3 argumentos, referente ao principalID que será o nome da politica que você quiser atribuir, um efeito, que no nosso caso é o Allow, que permite que uma ação seja executada e o ARN que informa o objeto que está recebendo a politica. No código acima, o ARN é o valor recebido pela própria requisição (event.methodArn)
Testando a função
Antes de configurar o API Gateway, vamos testar a função. No menu superior do lambda, existem 5 botões e uma caixa de seleção de modelo de teste. Clique na caixa de seleção e selecione a opção configure test events
Vamos criar um JSON e submete-lo a função lambda que acabamos de criar. Este JSON será igual ao payload enviado pelo API Gateway. Informe o nome desejado, em event template selecione Amazon API Gateway authorizer e clique em create.
Não esqueça de modificar o valor de authorizationToken para o valor da chave que você informou na função url-shrink-authorizer
Clique em Test e o resultado será apresentado
API GATEWAY
Acesse a API criada no artigo encurtador de URL com o nome url-shortener. No menu da esquerda, selecione a opção Authorizers e clique em Create new Authorizer.
preencha o authorizer conforme a imagem acima. Informe o nome de url-short-authorizer, selecione a lambda function que criamos url-short-authorizer e em token source informe o nome do header que usamos para enviar o token: authorizationToken.
Apos a confirmação, será exibida a mensagem abaixo, clique em Grant & Create.
O authorizer já está criado, você pode testa-lo clicando em Test.
agora você já pode associa-lo as chamadas de API que você quer aplicar este método de segurança. Vamos segurar a chamada ao encurtador de URL, que é o nosso método POST.
Clique no método POST e selecione Method Request. Nas opções de authorization, informe o authorizer que acabamos de criar.
é isso ai pessoal! qualquer dúvida e sugestão só colocar nos comentários aqui embaixo.
Seja o primeiro a comentar