DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on

[Desafio] - CRUD com Segurança Extra

Conteúdo original nessa thread do Twitter


Ei dev front e back-ender,

Pega esse desafio! Quero ver você resolver essa treta de segurança num CRUD.

Se quiser, pode fazer em dupla ou individual. E tá valendo nota :)

Segue o fio.

cc @sseraphini

img
img


O desafio é fazer um CRUD de qualquer coisa numa área logada. Toda operação que modifica o estado do banco (criar, apagar, editar) precisa de um token de expiração rápida (tipo ~5 segundos, por exemplo). E toda operação de leitura (listar, detalhar), um token de leitura.


Segue as specs dos endpoints:

Segurança:

  • POST para obter token de leitura.
  • POST para obter token de escrita com expiração rápida.

CRUD:

Endpoints que aceitam token de leitura:

  • GET para obter a coleção das coisas do CRUD.
  • GET para obter um item da coleção (tipo "por id").

Endpoints que aceitam token de escrita:

  • POST pra criar um item.
  • PUT para editar um item.
  • DELETE para excluir um item.

Um detalhe sobre os endpoints de escrita: se você fizer uma chamada com o token de leitura ou sem token, estes devem retornar um HTTP 401 com um challenge ─ ou seja, um header WWW-Authenticate com informações sobre como conseguir permissão de acesso.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate


Agora uns detalhes mais específicos pros frontenders:

  • Reuse o token de leitura do login. Não fique pedindo as credenciais pro usuário o tempo todo durante uma sessão.

  • Tente não deixar pro front saber quais são os endpoints de escrita. Tente se valer dos responses HTTP 401.


Se você quiser focar apenas no front, use APIs mocadas ─ desencana do backend.

Se quiser focar apenas no backend, desenvolva e teste no postman, curl, insomnia, etc.


Se você quiser uma camada extra de desafio, pense numa forma de usar um método diferente de autenticação pros tokens de escrita, tipo um OTP, reconhecimento facial, etc.

Faça do jeito que você quiser, mude o que quiser. O importante é aprender se divertindo.


Se fizer e versionar no github ganha ponto extra e se hospedar pra gente testar, passa direto de ano!

Se achou o desafio legal, dá um RT do amor, like, comenta.


Preciso nem dizer, né? Se leu até aqui, dá um abraço!

Obrigado demais pela moral, eu faço essas coisas pra você me apoia. ❤️

Top comments (3)

Collapse
 
urielsouza29 profile image
Uriel dos Santos Souza • Edited

Olá Francisco tudo bem?
Se vc quiser, existe uma tag de devs brasileiros.
Só por na aŕea de tags braziliandevs

Seu texto será mais visto por brasileiros

#braziliandevs

Tag dedicada a comunidade brasileira, com foco em conteúdo em Português do Brasil.
Collapse
 
zanfranceschi profile image
Francisco Zanfranceschi

Boa, valeu... vou incluir aqui :)

Collapse
 
felquis profile image
Felquis Gimenes

Eai, um login que gera um token permanente - não um JWT - é algo que pratico frequentemente até, ai tem muitas opções de onde persistir este token hashed ou não no servidor.

Agora um token que expira, eu tentaria usar algo mais parecido com um JWT.

Mas para ficar mais interessante - e sem saber ao certo se isso adicionaria mais ou menos segurança pois por muitos caminhos algo pode dar errado - tentaria usar um par de chaves publica/privada para cada usuário - ou uma só talvez dependendo da aplicação.

  • Em posse de um token válido
  • usuário logado coloca sua senha de 4 dígitos (ou outros meios de autenticação por segunda etapa) e sendo compatível com os registros
  • essa operação retorna um payload contendo período de validade encrypted por sua chave publica no servidor.
  • e devolveria este payload encrypted para quem fosse usar junto com o ID da conta.

Já no servidor que faz a escrita/update/delete em si

  • este receberia o ID do usuário
  • e um payload encrypted
  • Usando o ID, encontra a chave privada deste usuário
  • se conseguir abrir o payload quer dizer que realmente vem do usuário correto
  • porém ele também verifica se está dentro do período de validade

Faz algum sentido? :P