Introdução ao OAuth 2.0 e JWT em Java
Aplicações web e APIs modernas exigem mecanismos robustos de autenticação e autorização. Os dois padrões mais populares nesta área são OAuth 2.0 e JWT (JSON Web Tokens). Se você é um desenvolvedor Java iniciante, entender essas tecnologias abrirá caminho para criar aplicações seguras e escaláveis.
Neste artigo, vamos explorar o que são OAuth 2.0 e JWT, como eles funcionam juntos e como implementá-los em Java usando bibliotecas populares. Você aprenderá a configurar um servidor de autorização, gerar e validar tokens JWT, além de proteger suas APIs REST.
O que são OAuth 2.0 e JWT?
OAuth 2.0 — protocolo de acesso delegado
OAuth 2.0 é um protocolo de autorização que permite que aplicações obtenham acesso limitado aos recursos de um usuário sem compartilhar suas credenciais. Imagine que você queira dar a uma aplicação acesso às suas fotos no Google. Em vez de informar sua senha do Google para a aplicação, você usa OAuth 2.0, que emite um token temporário com direitos limitados para a aplicação.
Principais participantes do OAuth 2.0:
- Resource Owner — o usuário proprietário dos recursos
- Client — a aplicação que solicita acesso
- Authorization Server — o servidor que emite os tokens
- Resource Server — o servidor que fornece os recursos protegidos
JWT — formato compacto de token
JWT (JSON Web Token) é um padrão aberto (RFC 7519) para criar tokens de acesso que contêm declarações (claims) no formato JSON. O JWT consiste em três partes separadas por pontos:
- Header — contém o tipo do token e o algoritmo de assinatura (ex.: HS256 ou RS256)
- Payload — contém as declarações (ex.: ID do usuário, papéis, data de expiração)
- Signature — assinatura que garante a integridade do token
Exemplo de JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Implementação de OAuth 2.0 e JWT em Java
Configuração do projeto com Spring Security
Para implementar OAuth 2.0 e JWT em Java, usaremos Spring Boot e Spring Security. Vamos começar adicionando as dependências no arquivo pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>Criação do provedor JWT
Vamos criar a classe JwtProvider, que será responsável pela geração e validação de tokens JWT:
import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;import java.util.Date;
@Componentpublic class JwtProvider { private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final