JWT (Json Web Token) é um método usado pela indústria para realizar autenticação entre duas partes por meio de um token assinado
que autentica uma requisição web.
Comparado com a autenticação baseada em sessão onde é preciso armazenar a sessão no cookie, a vantagem da autenticação por JWT é que o token é armazenado no
client-side (Local Storage).
O intuito desse projeto é mostrar como é feito o fluxo de autenticação e autorização com JWT.
De forma simplificada, a imagem acima mostra como é feito o fluxo de de autenticação via JWT.
1. É enviada uma requisição com usuário e senha para login, após a verificação do back-end, o token é retornado ao front-end e salvo no Local Storage.
2. Após o token ser salvo, deve ser colocado no header para as futuras requisições para autenticar o usuário. A partir dai em toda requisição
é verificado o token pelo middleware, e se tudo estiver certo, os dados serão devolvidos ao front-end.
Endpoit | Retorno |
---|---|
/api/auth/signup | Registro de usuário |
/api/auth/signin | Login de usuário |
/api/test/user | Mostra as informações do usuário |
/api/test/all | Mostrar os conteúdos públicos |
/api/test/admin | Mostrar o conteúdo dos admins |
/api/test/mod | Mostrar o conteúdo dos moderadores |
$ git clone https://github.com/jeffersonximeness/jwt-authentication.git
$ cd jwt-authentication/
$ docker-compose up -d
O frontend do projeto foi construido com Typescript utilizando React com o framework Bootstrap para estilização, as requisições para a API foram feitas utilizando o Axios.
O backend/API foi construido com Node e o framework express. Para conexão com o banco de dados e consultas foi utilizado o ORM sequelize.
Ao registrar um usuário, automaticamente é criado uma 'ROLE_USER' que é o tipo comum de usuário, além desse tipo tem: 'ROLE_MODERATOR' e 'ROLE_ADMIN'.
Cada tipo de usuário pode acessar conteúdos referentes a sua ROLE. A lógica de acesso aos conteúdos é feita pelo frontend.
A infraestrutura da aplicação é feita com Docker, são criados 3 conteiners, um para cada parte da aplicação (banco de dados, backend e frontend).
Para orquestrar os conteiners foi utilizado Docker-compose.
A aplicação irá abrir localmente em http://localhost:8081