Implementando JWT com Deno e ABC
Leonardo Oliveira Balsalobre
Posted on June 11, 2020
Conforme temos visto nos ultimo meses, o novo runtime feito por Ryan Dahl (criador do Node) vem tomando espaço no cronograma de estudos de diversos desenvolvedores e entusiastas.
Mas o que é o Deno?
Deno visa fornecer um ambiente de script produtivo e seguro para o programador moderno. Ele é construído sobre V8, Rust e TypeScript.
A principal característica que chamou atenção no novo runtime, foi a forma com qual foi construído, sempre buscando tornar o acesso e o trafego dos dados mais seguro.
Por exemplo:
Em Node, para iniciarmos um servidor executamos "npm start" ou "npm run dev", de uma forma simples e imediata o seu servidor ja está rodando.
Já no Deno, é necessário dar permissão para que ele acesse sua internet(--allow-net), escrita(--allow-write), leitura(--alow-read), entre outros(--allow-all). E para aprimorar ainda mais nossa segurança iremos utilizar o famoso JWT.
Bora para o que interessa!
Nesse projeto usaremos as seguintes bibliotecas:
Framework ABC: https://deno.land/x/abc
Bcrypt: https://deno.land/x/bcrypt
Djwt: https://deno.land/x/djwt
Mongo: https://deno.land/x/mongo
Primeiramente vocês vão precisar baixar as dependências....
Só que não! O Deno importa suas dependências diretamente da sua raiz e assim não existe nenhum node_modules com alguns milhares de megabytes.
Ao iniciarmos a construção da nossa API, a primeira coisa que vamos fazer é criar um endpoint de usuário e como o Deno ja suporta Typescript por padrão então iremos utiliza-lo ;D
Primeiramente importamos HandlerFunc e Context que são premissas para criarmos as funções utilizando o framework ABC (também temos o Oak que tem uma similaridade com Koa)
Após importarmos note que estamos importando diretamente do deno.land, isso significa que ao iniciarmos o servidor o Deno irá baixar as dependências e armazená-las em um cache, mas isso é assunto para um outro artigo.
Também importaremos o bcrypt que é uma biblioteca para gerar hash da senha do usuário aumentando ainda mais a segurança da nossa API.
Em seguida iremos criar nosso token.ts que é a configuração da autenticação do JWT que será usada no projeto. Note que na expiração colocamos a data atual mais 60 * 60000 que significa 1 hora, onde 60000 é 1 minuto.
- Após nosso token estar totalmente configurado iremos fazer uma controller que se chamará authController.ts, ela será a responsável por interceptar todas as requisições da nossa API, sendo usada como um middleware. Outro ponto que gostaria de comentar é que ao construir esse projeto procurei inúmeras formas de validar quais rotas teriam acesso sem que o interceptador de token entrasse em vigor. A única forma com qual consegui foi buscando dentro do contexto da requisição qual é o path da rota, sendo assim fiz um if para que caso a rota não fosse a que eu queria, o interceptador seria executado, do contrario, a rota estaria livre de token, que é o cenário que queremos no caso de login.
- Por fim iremos no nosso server.ts fazer com que nosso app use o authController como middleware.
Considerações finais
Para quem não tem conhecimento em API's ou até mesmo em Deno básico, talvez esse artigo não seja tão útil, mas a intenção foi passar o conhecimento de como utilizei o ABC para fazer uma autenticação JWT, até o momento em que fiz esse mini-projeto não havia encontrado em lugar algum da internet uma autenticação JWT que não usasse o Oak.
Para fins de duvidas, estou disponibilizando meu repositório que é exatamente esse da imagem onde tenho um Crud completo de usuário com bcrypt e JWT implementados.
Link do repositório: https://github.com/oliveirabalsa/deno-demo
Por enquanto é isso e nos vemos em breve, dúvidas ou sugestão deixem nos comentários ou nos procure nas redes Sociais!
Acompanhe nossos canais de conteúdo:
Posted on June 11, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.