Introdução ao OAuth 2.0 e JWT em Java
\n\nAs aplicações web e APIs modernas raramente dispensam mecanismos de autenticação e autorização. Os dois padrões mais populares nesta área são OAuth 2.0 e JWT (JSON Web Token). Se você é um desenvolvedor Java iniciante, compreender essas tecnologias abrirá caminho para a criação de sistemas seguros e escaláveis.
\n\nOAuth 2.0 é um protocolo de autorização que permite que aplicações obtenham acesso limitado aos recursos do usuário sem transmitir suas credenciais. JWT, por sua vez, é um formato compacto de token usado para transmitir afirmações (claims) entre as partes. Neste artigo, vamos analisar como combinar essas tecnologias em uma aplicação Java, utilizando Spring Security e bibliotecas populares.
\n\nFundamentos do OAuth 2.0: como funciona
\n\nOAuth 2.0 define vários papéis para os participantes da interação:
\n\n- \n
- Resource Owner — o usuário que possui os dados protegidos \n
- Client — a aplicação que solicita acesso \n
- Authorization Server — o servidor que emite tokens após a autenticação \n
- Resource Server — o servidor que armazena os recursos protegidos \n
A ideia principal do protocolo é que o cliente recebe um token de acesso temporário, que apresenta ao servidor de recursos. O cenário mais comum é o Authorization Code Flow, usado em aplicações web.
\n\nExemplo de configuração de cliente OAuth 2.0 no Spring Boot
\n\nAdicione a dependência no pom.xml:
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n\nConfigure o application.yml para funcionar com o Google OAuth 2.0:
spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: YOUR_CLIENT_ID\n client-secret: YOUR_CLIENT_SECRET\n scope:\n - email\n - profile\n\nAgora, o Spring Security lidará automaticamente com o redirecionamento para a página de login do Google e retornará o token de acesso.
\n\nJWT: estrutura e criação do token
\n\nO JWT consiste em três partes, separadas por pontos:
\n\n- \n
- Header — contém o tipo do token e o algoritmo de assinatura (ex.: HS256) \n
- Payload — contém as afirmações (claims): dados do usuário, prazo de validade, função \n
- Signature — assinatura criada a partir do cabeçalho e da carga útil usando uma chave secreta \n
Para trabalhar com JWT em Java, a biblioteca mais utilizada é a jjwt. Adicione a dependência:
\n\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.5</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n\nCriação de token JWT em Java
\n\nAqui está um exemplo de classe para geração e validação de JWT:
\n\nimport io.jsonwebtoken.*;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n\n private final SecretKey secretKey = Keys.hmacShaKeyFor(\n "my-secret-key-which-should-be-at-least-256-bits-long".getBytes()\n );\n\n public St