O blog da AWS
Autenticando suas aplicações através de reconhecimento facial utilizando o Amazon Cognito e o Amazon Rekognition
Com o passar do tempo, acaba sendo notório o aumento do uso de diferentes aplicativos, redes sociais, plataformas financeiras, e-mails, plataformas de armazenamento em nuvem, etc. E com isso, gerenciar diferentes senhas e credenciais pode se tornar um desafio um tanto quanto doloroso.
Em muitos casos, compartilhar uma única senha através de todos estes aplicativos e plataformas não é uma realidade. Padrões de segurança diferentes são exigidos, composição apenas com caracteres numéricos, políticas de renovação de senha, fora a simples questão de segurança.
Mas e se pudéssemos ampliar as formas de usuários se autenticarem em suas aplicações de uma maneira mais simples, conveniente, e acima de tudo, segura?
Este artigo demonstra como utilizar o Amazon Cognito user pools para customizar seus fluxos de autenticação e permitir login em suas aplicações com o auxílio do Amazon Rekognition para reconhecimento facial através de uma aplicação simples.
Visão Geral da Solução
Ao realizar o cadastro de um novo usuário em uma aplicação Mobile ou Web, além de definir um e-mail, solicitamos que o usuário faça o upload de um documento com foto. Utilizando o Amplify Framework, podemos facilmente integrar nossa aplicação Front-End com o Amazon S3 e armazenar esta imagem em um bucket seguro e criptografado. Uma função Lambda será disparada para cada nova imagem dentro deste bucket para que possa indexar a imagem dentro do Amazon Rekognition a gravar em uma tabela do DynamoDB seus metadados para consultas posteriores.
Para autenticação, esta solução utiliza o Amazon Cognito user pools com funções Lambda para customizar os fluxos de autenticação em conjunto com a API de CompareFaces do Amazon Rekognition para identificar o nível de assertividade entre a imagem passada no momento do cadastro do usuário.
O fluxo acima descreve os passos percorridos pela solução:
- O usuário realiza o Sign Up cadastrando seus dados no User Pool.
- O usuário anexa no momento do Sign Up uma foto de um documento com nome e foto, por exemplo, um passaporte, que é carregado para um S3 Bucket.
- Uma função Lambda é disparada com os dados da imagem carregada no bucket.
- A função indexa a imagem dentro da Collection específica de documentos de usuários criada no Amazon Rekognition.
- A mesma função, após a indexação, persiste em uma tabela do DynamoDB os metadados da imagem indexada, juntamente com o e-mail cadastrado no Cognito user pool para consultas posteriores.
- O usuário entra um e-mail na página de Sign In, que envia a solicitação para o Cognito user pools.
- O user pool invoca a função de “Define Auth Challenge”, que determina qual desafio customizado deverá ser criado no momento.
- O user pool invoca a função de “Create Auth Challenge”, que consulta no DynamoDB pelos dados do usuário o dono do e-mail informado para recuperar os dados da imagem indexada no Rekognition.
- O user pool invoca a função de “Verify Auth Challenge”, que verifica se o challenge anterior foi de fato completado com sucesso, e caso tenha encontrado a imagem, compara com a foto tirada no momento do Sign In para validar a assertividade na comparação entre as duas imagens.
- O user pool invoca novamente a função “Define Auth Challenge”, que verifica que o desafio foi respondido com sucesso e que não existem novos desafios a serem criados. Ele inclui um atributo de “issueTokens:true” no seu payload de resposta para o user pool. O user pool pode se considerar autenticado agora, e envia para o usuário um JSON Web Token (JWT) (resposta para o passo 6).
Aplicação Serverless
A implementação a seguir está disponibilizada como uma aplicação serverless. Você pode fazer sua implantação a partir do AWS Serverless Application Repository.
As principais partes desta aplicação são:
- Obrigatório que os usuários cadastrarem um e-mail válido.
- O App Client do Cognito User Pool está configurado como “Only allow custom authentication” já que quando um usuário se cadastra, o Amazon Cognito requer uma senha para este usuário. Vamos criar uma senha randômica para este usuário, visto que não queremos que ele faça Sign In com esta senha posteriormente.
- Dois S3 Buckets: um para armazenar as imagens de documentos carregados no momento do Sign Up, e um para armazenar as imagens passadas no momento do Sign In para comparações.
- As seguintes funções Lambda que implementam o indexamento das imagens no Amazon Rekognition e customizam os desafios de autenticação no Amazon Cognito User Pools:
- Create Rekognition Colletion (Python 3.6) – Está função Lambda é disparada apenas uma vez no início da implementação, para criar uma Custom Collection no Amazon Rekognition, que servirá como indexador para os documentos carregados no momento do Sign Up de cada usuário.
- Index Faces (Python 3.6) – Esta função Lambda é disparada para cada novo upload de documento no Bucket S3 selecionado, e se responsabiliza por indexar este documento na collection do Amazon Rekognition e persistir seus metadados no DynamoDB.
- Define Auth Challenge (Node.js 8.10) – Esta função Lambda rastreia o fluxo de autenticação customizado, que se compara ao de uma função “decider” de uma máquina de estado. Ela determina qual desafio deverá ser criado para usuário e em qual ordem. No final, ela reporta de volta para o user pool se o usuário passou ou não na autenticação. Esta função é invocada no início do fluxo de autenticação, e também após o término de cada função “Verify Auth Challenge Response”.
- Create Auth Challenge (Node.js 8.10) – Esta função Lambda é invocada baseada na instrução da função “Define Auth Challenge”, para criar um desafio único para o usuário. Usaremos esta função para pesquisar no DynamoDB se existem registros para o usuário em questão e se seus metadados são válidos.
- Verify Auth Challenge Response (Node.js 8.10) – Esta função Lambda é invocada pelo user pool quando o usuário provê uma resposta para o desafio criado. Seu trabalho é simplesmente validar se sua resposta está correta. Neste caso, comparar as imagens passadas nos momentos do Sign Up e Sign In usando a API de CompareFaces do Amazon Rekognition e, se o nível de assertividade for maior que 90%, considera como resposta válida.
Criando uma Collection no Amazon Rekognition
Esta função é responsável apenas por criar uma Collection no Amazon Rekognition para receber imagens de documentos com fotos de usuários no momento do Sign Up.
Indexando Imagens no Amazon Rekognition
Esta função é responsável por receber os dados e indexá-la na Collection do Amazon Rekognition e persistir seus metadados na tabela do DynamoDB.
Função Define Auth Challenge
Esta função é responsável por gerenciar o fluxo de autenticação do User Pool. No array de session (event.request.session), está presente todo estado do fluxo de autenticação.
Se ela estiver vazia, o fluxo de autenticação acabou de começar. Se ela possuir itens, o fluxo está em andamento: um desafio foi apresentado ao usuário, o usuário apresentou uma resposta, e foi verificada se está correta ou errada. Em qualquer um dos casos, esta função decide o que fazer em seguida.
Função Create Auth Challenge
Esta função busca no DynamoDB por um registro contendo o e-mail providenciado pelo usuário e recupera o ID do seu objeto dentro da Collection do Amazon Rekognition, e define como desafio que o usuário forneça uma foto que referencie a mesma pessoa.
Função Verify Auth Challenge Response
Esta função é responsável por verificar no Amazon Rekognition se é possível encontrar uma imagem com assertividade igual ou acima de 90% com a imagem enviada no momento do Sign In, e se a imagem faz referência de fato a mesma pessoa que o usuário alega ser através do e-mail passado.
Aplicação Front-End
Para coordenar , é necessário criar uma página de Sign In customizada. Você pode usar o AWS Amplify Framework para integrar sua página de Sign In com o Amazon Cognito e o upload de fotos com o Amazon S3.
O Amplify Framework permite que você implemente suas páginas utilizando seu framework favorito (React, Angular, Vue, HTML/JavaScript, etc). Os exemplos abaixo podem ser customizados para satisfazer suas necessidades específicas.
O trecho abaixo demonstra como importar e inicializar o AWS Amplify Framework utilizando React:
Realizando o Sign Up
Para usuários que desejam se cadastrar, conforme explicado acima, iremos gerar uma senha randômica para satisfazer a obrigatoriedade por parte do Cognito, porém ao criar nosso Client do User Pool, garantimos que a autenticação somente aconteça seguindo o fluxo customizado, e nunca com usuário e senha.
Realizando o Sign In
Responsável por iniciar o fluxo de autenticação customizado para o usuário.
Respondendo o Desafio Customizado
Nesta fase, habilitamos a câmera através do Browser para tirar uma foto e realizar seu upload para o S3 para enfim informar ao usuário que ela está disponível para comparação.
Conclusão
Neste Blog Post, nós implementamos um mecanismo de autenticação utilizando reconhecimento facial, utilizando os fluxos de autenticação customizados do Amazon Cognito e o Amazon Rekognition para comparação facial. Dependendo dos critérios de segurança da sua empresa e da sua aplicação, este cenário pode funcionar para você tanto do ponto de vista de segurança, quanto de experiência para o usuário.
Adicionalmente, podemos incrementar o fator de segurança, é possível definir uma cadeia de Auth Challenges compostos não só pela foto do usuário, mas também de uma combinação dos números do documento utilizado no momento do cadastro, entre outros challenges como MFA’s adicionais.
Como esta é uma solução totalmente serverless e baseada em funções Lambda, você pode customizá-la de acordo com suas necessidades. Leia mais sobre autenticações customizadas através do nosso guia do desenvolvedor.
Recursos
- Os códigos da implementação acima estão disponíveis no GitHub. Você pode alterar, fazer o deploy e rodar o código você mesmo.
- Você pode fazer o deploy da solução diretamente através do AWS Serverless Application Repository.
Enrico Bergamo
Enrico é arquiteto de soluções na AWS focado no segmento Enterprise, e atua auxiliando clientes de diversos segmentos em suas jornadas para a nuvem. Com mais de 10 anos de experiência em Arquitetura e Desenvolvimento de Sistemas, e DevOps, Enrico atuou diretamente com diversas empresas na definição, implementação e implantação de diversas soluções corporativas.