Precisamos enviar uma senha de maneira segura para um cliente. Para isso, ao invés de encaminhá-la via E-mail, SMS, Slack, etc, foi dado como solução o desenvolvimento de um sistema com as seguintes funções:
1- Usuário irá inserir uma senha ou solicitar ao Sistema para gerar senha aleatória baseada em políticas de complexidade (tipo de caracteres, números, letras, tamanho, etc);
- Exemplo1: o usuário digita sua senha no campo de texto;
- Exemplo2: o usuário seleciona os parametros de complexidade de senha e ao clicar no botão "Gerar Senha" irá obter uma senha aleatória;
2- Usuário irá especificar quantas vezes a senha gerada poderá ser vista e qual o tempo que a senha ficará válida;
- Exemplo: o usuário irá especificar que a senha possa ser vista apenas duas vezes pelo prazo de um dia;
3- O sistema irá gerar uma URL que dá acesso a visualização da senha, baseando-se nos critérios do item 02;
- Exemplo: o usuário enviará a URL para que o cliente possa visualizar a senha;
4- Após atingir a quantidade de visualizações ou o tempo disponível, o sistema bloqueia/elimina a visualização da senha (expirado). A senha não deve ser armazenada após sua expiração
- Exemplo1: Senha foi gerada para 2 visualizações e 2 dias de prazo. Cliente clicou na url 3 vezes seguidas no primeiro dia. 1º acesso: senha disponível e pôde ser visualizada. Contador atualizado para 1 view 2º acesso: senha disponível e pôde ser visualizada. Contador atualizado para 2 views=limite definido. Senha deletada 3º acesso: senha já deletada da base. Retorna mensagem de senha indispovível
- Exemplo2: Senha foi gerada para 2 visualizações e 2 dias de prazo. Cliente só clicou na url depois de 4 dias que a mesma foi gerada. 1º acesso: senha já deletada da base após o prazo de 2 dias. Retorna mensagem de senha indispovível
- Exemplo3: Senha foi gerada para 2 visualizações e 2 dias de prazo. Cliente clicou na url 2 vezes: uma assim que recebeu a mesma e a segunda depois de 5 dias. 1º acesso: senha disponível e pôde ser visualizada. Contador atualizado para 1 view 2º acesso: senha já deletada da base após o prazo de 2 dias. Retorna mensagem de senha indispovível
1 - Monte um desenho com a arquitetura desse sistema, considerando todos os componentes e tecnologias necessárias para o seu correto funcionamento. Considere essa topologia utilizando, obrigatoriamente, provedores de nuvens públicas trabalhando com o conceito de serverless. Escolha a nuvem que tiver mais conforto em trabalhar (AWS, GCP, Azure, etc). Para o backend recomendamos o uso dos serviços:
- AWS: Lambda, API Gateway, DynamoDB, entre outros que não precisem de servidor (dessa forma, desaconselhamos o uso de EC2, EKS, RDS, etc)
- GCP: Cloud Functions, Cloud Endpoints, Cloud Firestore, entre outros que não precisem de servidor (dessa forma, desaconselhamos o uso de Compute Engine, GKE, Cloud SQL, etc)
- Azure: Functions, API Management, CosmosDB, entre outros que não precisem de servidor (dessa forma, desaconselhamos o uso de Virtual Machine, AKS, SQL Database, etc)
2 - Explique como atender cada uma das 4 funções elencadas acima (requisítos) e o racional de sua decisão.
- Exemplo: A senha aleatória será gerada no front-end por xyz, ou será gerada com uma função no backend por abc.
3 - Opcional: Avalie quais controles de segurança são pertinentes para esse sistema, com o objetivo de protegê-lo ao máximo, evitando vazamento de dados (ex: considere o OWASP Top10). Questões de auditoria e logging são importantes também.
4 - Sinta-se livre para adicionar seus comentários de novas melhorias que você julgar desejável. A TOTVS estimula a criatividade e a liberdade de expressão!
Faça uma sucinta explicação sobre o racional do seu desenho.
Essa documentação pode ser entregue em um arquivo pdf ou como parte da documentação no repositório (Arquivos MarkDown com topologia no Draw.io, etc)
Faça um Fork desse repositório, Crie uma branch com seu nome (ex: application/jose_silva).
Selecione uma das linguagens abaixo para implementar o backend do projeto:
- Python
- C (e suas variações)
- Golang
Selecione um dos frameworks abaixo para implementar o frontend do projeto:
- ReactJC
- AngularJS
Envie um PR nesse repositorio do GitHub contendo as implementações do projeto com base na arquitetura descrita que você desenvolveu do sistema (Queremos avaliar sua lógica de programação e estruturação do código).
Para testar as implementações de seu projeto antes de enviar, recomendamos o uso do free tier das nuvens públicas ou projetos que emulem localmente tais nuvens como o localstack (https://github.com/localstack/localstack).