Implementando JWT com Deno e ABC
Tags: deno, typescript, rust, javascript
Published: 2020-06-11 14:39:26

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

1. 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)


2. 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.

![Criando usuário](https://dev-to-uploads.s3.amazonaws.com/i/leaea9b7luuqtlw8g2ep.png)

3. 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.

4. 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.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/vxxqc7c5znlii7n6jtfg.png)

5. 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.


![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/rynubiia3bx2i9n0d9hq.png)

6. Por fim iremos no nosso server.ts fazer com que nosso app use o authController como middleware.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/uzuu3weriv0jvou835ay.png)


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:
- [Youtube](https://www.youtube.com/channel/UCCnvFA6ZShN67V54UsytH0g)
- [Pagina Facebook](https://www.facebook.com/DenoLandBR)
- [Grupo Facebook](https://www.facebook.com/groups/denobr)
- [Discord](https://discord.gg/Z35yKzN)