🚀 Capítulo 17: Missão Impossível: JWT (Tema: Missão Impossível)
NOTE
Este capítulo utiliza a temática de Missão Impossível para explicar a autenticação via JWT no Spring Boot. Proteja as rotas da sua API com mensagens criptografadas!
1. 🎯 Objetivo da Aula
Compreender como funciona a autenticação e autorização em APIs usando o framework Spring Security e como gerar e validar tokens JWT (JSON Web Token).
2. 🏢 O Cenário Prático (Seu Desafio)
Nos filmes da série Missão Impossível, o agente secreto Ethan Hunt recebe suas ordens através de mensagens gravadas que contêm os dados da missão e provam que ele é um agente legítimo da organização. Ninguém mais consegue falsificar ou ler essas mensagens porque elas usam um código secreto que só a agência conhece!
No mundo das APIs reais, nós não podemos deixar rotas como /deletar-conta abertas para qualquer pessoa na internet acessar.
- Nós usamos o Spring Security para colocar guardas nas portas das nossas rotas.
- E usamos o JWT como a mensagem secreta: um texto longo e criptografado que o servidor gera quando o usuário digita a senha correta. O usuário guarda esse token e o envia de volta para provar quem ele é! Seu desafio é proteger os segredos!
🧠 Fundamentos: A Teoria Traduzida
🛡️ 1. O que é o Spring Security?
É o framework padrão do ecossistema Spring focado em fornecer autenticação (saber quem você é) e autorização (saber o que você pode fazer) para as aplicações Java.
🔄 2. O Fluxo do JWT no Spring:
- O usuário envia login e senha.
- O Spring Security verifica. Se estiver correto, ele usa uma biblioteca (como a
auth0 java-jwt) para criar um token assinado com uma chave secreta. - O usuário recebe esse token e o guarda no aplicativo.
- Sempre que o usuário for acessar uma rota protegida, o Spring Security intercepta a chamada, lê o token do cabeçalho da requisição e verifica se a assinatura é válida. Se for, ele deixa passar!
4. 📖 Exemplo Guiado: O Guarda das Rotas
Veja como configurar o Spring Security para exigir autenticação em algumas rotas e deixar outras públicas:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf().disable() // Desabilita proteção contra CSRF (padrão para APIs)
.authorizeHttpRequests()
.requestMatchers(HttpMethod.POST, "/login").permitAll() // Rota pública!
.anyRequest().authenticated() // Todas as outras rotas exigem token!
.and()
.build();
}
}5. 🛠️ Prática Obrigatória 1: O papel do Spring Security
Com base no texto:
- Qual é a função principal do framework Spring Security em um projeto Java? Cite as duas coisas que ele faz (começam com a letra A).
6. 🛠️ Prática Obrigatória 2: Rotas Públicas
- No exemplo guiado acima, qual foi a única rota que deixamos pública (que qualquer um pode acessar sem precisar de token)? Por que essa rota precisa ser pública?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 17 Java_MissaoImpossivel) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
spec_backend_com_java_e_springboot/
├── capitulos/
│ └── capitulo_17_missao_impossivel.md💡 Checkpoint de Lógica
Os tokens JWT costumam ter uma data de expiração (ex: valem por horas). Isso serve para que, caso um hacker consiga roubar o token do usuário, ele não consiga acessar a conta para sempre!
10. 🔥 Desafio de Fixação
Pesquise o que significa o termo Stateless no contexto do Spring Security e por que ele é usado em APIs REST.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- Ele cuida da segurança do sistema. As duas funções são: Autenticação (verificar a identidade do usuário, saber quem ele é) e Autorização (verificar as permissões do usuário, saber o que ele pode fazer). Gabarito da Prática 2:
- Foi a rota
POST /login. Ela precisa ser pública porque é justamente através dela que o usuário vai enviar a sua senha para receber o token! Se ela fosse trancada, o usuário nunca conseguiria fazer o primeiro acesso!