Autenticação JWT no Spring boot

6 minutos para ler

JSON Web Token (JWT), é um padrão que define uma forma segura de transmitir mensagens utilizando um token compacto e self-contained no formato de um objeto JSON.

A assinatura de um JSON Web Token é seu componente mais sensível por tratar justamente da segurança deste token. Por conta disto existe uma fórmula padrão para que o token seja adequadamente assinado, exigindo que o token seja uma hash em Base64 gerada de um algoritmo de criptografia, por exemplo SHA256 ou SHA512, e essa hash precisa ser feita a partir do header e do payload do token.

Se você ainda não possui um projeto criado e quer ver como fazer isso de maneira simples, preparei um outro tutorial extremamente simples de como inicializar o seu projeto spring https://medium.com/rapaduratech/microservices-em-java-com-spring-boot-3fc3ec75638d.

Caso queira adicionar também o swagger ao seu projeto para ter uma ferramenta de documentação e teste de api pode seguir o seguinte post, https://medium.com/rapaduratech/adicionando-swagger-para-testar-sua-api-em-spring-boot-1eebeee70d0f irei mostrar como adicionar a permissão ao swagger ne tutorial também.

Agora que você já possui um projeto spring funcional, vamos configurar o Spring Security e o JWT para executar duas operações:
Gerar token JWT: Exponha uma API POST com mapping / authenticate. Ao passar o nome de usuário e a senha corretos, ele gerará um JSON Web Token (JWT).
Validar o JWT: Se um usuário tentar acessar a API GET com o mapeamento / hello, ele permitirá o acesso somente se uma solicitação tiver um JSON Web Token (JWT) válido.

Adicione a dependência do spring security e do jjwt

dentro do seu arquivo pom.xml, adicione essas dependências dentro das tags <dependencies></dependencies>:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
</dependency>

Dentro do seu application.properties adicione uma chave que vai ser usada para o algoritimo de hash.

jwt.secret=usersecretforjwtauthenticateoratoroeuaroupadoreideromalalalameudeuscomoessabencaodechave

Primeiro vamos criar um pacote config para colocar nossasclasses referentes as configurações da geração do JWT e criar nosso JwtTokenUtil que faz uso daio.jsonwebtoken.Jwts.

JwtTokenUtil hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/f9b8f258ebb6ecbef7ce6911ed0bbb26/raw/730969fd77ea78f3cf0bdd95e5b701cdd8f06f4c/JwtTokenUtil

Agora vamos criar o nosso controller para gerenciar a autenticação da nossa aplicação. Usando o Spring Authentication Manager, autenticamos o nome de usuário e a senha. Se as credenciais forem válidas, um token JWT será criado usando o JWTTokenUtil e será fornecido ao cliente.

JwtAuthenticationController hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/cb9253afabf8c54ce260458a4d42cf0a/raw/441380f412ab72b8891f5eb434d4176be599381b/JwtAuthenticationController

Agora vamos criar um model para guardar os dados recebidos do cliente a JwtRequest

JwtRequest hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/842ec1c704adb71c1f5bef5f3efc4eed/raw/4854aeb11fdf522f12031db51e3c6dfea746695b/JwtRequest

Agora iremos criar para guardar o token jwt que vai ser enviado para o client, JwtResponse

JwtResponse hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/eb6a259b071bf05cfee868b801186a2c/raw/3f3a78e799ddd4353a3060a766e6fd7d10ce3a53/JwtResponse

O JwtRequestFilter estende a classe do Spring Web Filter OncePerRequestFilter. Para qualquer solicitação recebida, essa classe de Filtro é executada. Ele verifica se a solicitação possui um token JWT válido. Se tiver um token JWT válido, ele define a autenticação no contexto para especificar que o usuário atual é autenticado.

JwtRequestFilter hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/0ba56ebf3976d1df8403e5a553121ff4/raw/8f5cdd2da73278b0a1fa9824a18e2051252df4c9/JwtRequestFilter

Agora iremos criar a JwtAuthenticationEntryPoint, essa classe estenderá a classe AuthenticationEntryPoint do Spring e substituirá seu método commence. Ele rejeita todas as solicitações não autenticadas e envia o código de erro 401.

JwtAuthenticationEntryPoint hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/7c317d444043b489830b80929ec5e0ca/raw/817083de20df946dca518d1abcc3c41430f4c906/JwtAuthenticationEntryPoint

Agora iremos criar uma classe JwtUserDetailsService que implementaaUserDetailsService do spring security e checar o login do usuário, nesse tutorial o usuário e a senha serão fixos no código, em um tutorial futuro iremos buscar esses dados no banco.

JwtUserDetailsService hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/d38f5aeec867a15566e71159e84000c6/raw/bb87898cf65e3996b8e5ec42dabf5653f12dd57e/JwtUserDetailsService

Esta classe estende o WebSecurityConfigurerAdapter. Essa é uma classe que permite a personalização para o WebSecurity e o HttpSecurity, aqui podemos definir que urls devemos permitir ou não.

WebSecurityConfig hosted with ❤ by GitHub https://gist.githubusercontent.com/Odilio/079043dd85d52b9fe4a387eb38dff7e8/raw/5d56acdbf22f05cba803abe560b547b65526c865/WebSecurityConfig

Projeto com autenticação pronta, as collections do postman para testar fica dentro de resources, na raiz da pasta do projeto.

https://github.com/Odilio/Boilerplate-springboot

Neste artigo vimos uma autenticação padrão, sem níveis de acesso, mas muitas vezes podemos querer criar roles, que irão definir o que cada tipo de usuário pode acessar, para isso temos a continuação deste artigo https://medium.com/rapaduratech/autentica%C3%A7%C3%A3o-jwt-com-n%C3%ADveis-de-acesso-usando-spring-security-7e8a02dcb64c

Espero que ajude a quem está procurando implementar este tipo de autenticação, em breve irei tratar sobre outros métodos.

Escrito pelo #FERA Odilio Noronha para Medium: https://medium.com/@odilionoronha/autentica%C3%A7%C3%A3o-jwt-no-spring-boot-d464d9bab3a4

Você também pode gostar

Deixe um comentário