OAuth 2.0 e autorização JWT em Java: na prática
\n\nAplicações web e APIs modernas raramente funcionam sem mecanismos de autenticação e autorização. Os dois padrões mais populares — OAuth 2.0 e JWT (JSON Web Token) — permitem transmitir dados do usuário com segurança e conceder acesso a recursos. Neste artigo, vamos abordar como implementar a autorização OAuth 2.0 e JWT em Java com um exemplo prático usando Spring Boot. Você aprenderá como configurar o servidor de autorização, gerar e verificar tokens JWT, além de proteger os endpoints da sua REST API.
\n\nO que são OAuth 2.0 e JWT: uma visão geral rápida
\nOAuth 2.0 é um protocolo de acesso delegado que permite que aplicativos de terceiros obtenham acesso limitado aos recursos do usuário sem compartilhar suas credenciais. Ele é amplamente utilizado para login através de redes sociais (Google, Facebook) e para proteger APIs.
\nJWT (JSON Web Token) é um formato de token compacto e autossuficiente que contém informações do usuário (claims) e é assinado para verificar sua integridade. O JWT é frequentemente usado como access token no OAuth 2.0, pois não requer armazenamento no servidor e é facilmente transmitido em cabeçalhos HTTP.
\nNa prática, o OAuth 2.0 define o fluxo (flow) de obtenção do token, enquanto o JWT define o formato do token em si. Juntos, eles formam um sistema de autorização poderoso e seguro.
\n\nConfiguração do projeto Spring Boot com dependências
\nPara começar, vamos criar um projeto Spring Boot básico. Usaremos Spring Security, Spring Web e uma biblioteca para trabalhar com JWT (por exemplo, jjwt).
Adicione as seguintes dependências ao seu pom.xml (Maven) ou build.gradle (Gradle):
<!-- Maven -->\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-security</artifactId>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.3</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\nAgora, vamos criar uma classe de configuração de segurança que desabilitará o CSRF e definirá a cadeia de filtros.
\n\nImplementação do servidor de autorização e geração de JWT
\nPara o OAuth 2.0, precisaremos de um endpoint que receba as credenciais do cliente e retorne um token JWT. No caso mais simples, isso pode ser uma simulação do servidor de autorização.
\nVamos criar um serviço para trabalhar com JWT:
\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport io.jsonwebtoken.security.Keys;\nimport org.springframework.stereotype.Service;\n\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\n@Service\npublic class JwtService {\n\n private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);\n private final long expirationMs = 3600000; // 1 hora\n\n public String generateToken(String username) {\n Date now = new Date();\n Date expiryDate = new Date(now.getTime() + expirationMs);\n\n return Jwts.builder()\n .subject(username)\n .issuedAt(now)\n .expiration(expiryDate)\n .signWith(secretKey)\n .compact();\n }\n\n public String