🚀 Capítulo 19: Criando a Inteligência da API
NOTE
Este capítulo utiliza a temática de Ultron para explicar a Autenticação de APIs no FastAPI usando Tokens JWT. Proteja a inteligência do seu sistema!
🎯 Objetivo da Aula
Compreender como funciona a autenticação baseada em Tokens JWT (JSON Web Tokens) para APIs Rest no FastAPI, aprendendo a proteger as rotas do sistema contra acessos não autorizados.
🏢 O Cenário Prático (Seu Desafio)
A inteligência artificial Ultron está tentando invadir os sistemas globais. Para impedir que ele assuma o controle de todas as máquinas, os Vingadores precisam criar um protocolo de segurança nível máximo. Cada herói ou máquina aliada que quiser acessar o banco de dados central precisa apresentar uma “Chave de Acesso Digital” única (um Token). Se o Token for válido, o acesso é liberado!
No desenvolvimento de APIs (onde não temos uma tela visual para o usuário digitar login e senha toda vez):
- O usuário envia o login e senha uma vez.
- O servidor valida e devolve um texto gigante criptografado (o Token JWT).
- A partir daí, o usuário envia esse Token no cabeçalho (Header) de todas as próximas requisições. Seu desafio é gerar e validar esses tokens!
🧠 Fundamentos: A Teoria Traduzida
🔑 1. O que é o JWT?
É um padrão de mercado para criar tokens de acesso. O token é composto por três partes separadas por pontos: cabecalho.dados.assinatura.
- A assinatura garante que ninguém alterou os dados do token no meio do caminho!
🏗️ 2. Gerando um Token em Python:
Usamos a biblioteca python-jose para gerar os tokens.
from datetime import datetime, timedelta
from jose import jwt
# Configurações secretas
SECRET_KEY = "chave-super-secreta-dos-vingadores"
ALGORITHM = "HS256"
def criar_token_acesso(dados: dict):
tempo_expira = datetime.utcnow() + timedelta(minutes=15)
dados.update({"exp": tempo_expira})
token_jwt = jwt.encode(dados, SECRET_KEY, algorithm=ALGORITHM)
return token_jwt🛡️ 3. Protegendo a Rota no FastAPI:
O FastAPI tem um sistema de segurança chamado HTTPBearer que lê o token do cabeçalho automaticamente!
from fastapi import Depends, FastAPI, HTTPException
from fastapi.security import HTTPBearer
app = FastAPI()
security = HTTPBearer()
@app.get("/dados/secretos")
def rota_protegida(credentials=Depends(security)):
token = credentials.credentials
# Aqui você usaria o jwt.decode() para validar o token!
return {"mensagem": "Acesso liberado aos arquivos secretos!"}📖 Exemplo Guiado: O Cabeçalho Bearer
Para enviar o token via código (usando ferramentas como Postman ou Insomnia), o usuário precisa colocar no cabeçalho (Header) da requisição:
Authorization: Bearer texto_do_seu_token_aqui...O FastAPI lê esse cabeçalho, valida o token e libera o acesso à função da rota!
🛠️ Prática Obrigatória 1: O que significa JWT?
- Qual é o significado da sigla JWT?
🛠️ Prática Obrigatória 2: Tempo de Expiração
- Por que é importante colocar uma data de expiração (
exp) nos tokens de acesso das APIs?
📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:
- Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
- Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
- Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
- Faça o Commit:
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
Finaliza atividades do Capítulo. - Clique no botão azul Commit to main (ou o nome da sua branch).
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
- Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
- ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
- Como entregar no Microsoft Teams:
- Copie o link do seu repositório no GitHub (ex:
https://github.com/seu-usuario/seu-repositorio). - Abra a tarefa correspondente no Microsoft Teams.
- Clique no botão Adicionar trabalho (ou Add work).
- Selecione a opção Link no menu lateral.
- Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex:
Meu Repositório) no campo “Texto a ser exibido”. - Clique em Anexar.
- MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!
- Copie o link do seu repositório no GitHub (ex:
📂 Estrutura de Pastas
spec_backend_com_python_e_fastapi/
├── capitulos/
│ └── capitulo_19_ultron_p1.md💡 Checkpoint de Lógica
Os tokens de API funcionam como chaves físicas. Se alguém roubar o seu token, poderá acessar o sistema fingindo ser você até que o token expire! Por isso, nunca compartilhe seu token e use sempre conexões seguras (HTTPS).
🔥 Desafio de Fixação (Opcional)
Pesquise como decodificar um token JWT em Python usando a função jwt.decode() e como capturar o erro caso o token tenha expirado (Dica: ExpiredSignatureError).
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- Significa JSON Web Token. Gabarito da Prática 2:
- Para limitar o tempo de uso do token. Se um invasor conseguir roubar o token, ele só poderá usá-lo por um curto período de tempo (ex: 15 minutos) antes que ele pare de funcionar.