🚀 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?

  1. Qual é o significado da sigla JWT?

🛠️ Prática Obrigatória 2: Tempo de Expiração

  1. 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:

  1. Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
  2. Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
  3. Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
  4. 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).
  5. 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.
  6. ⚠️ 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.
  7. 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!

📂 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:

  1. Significa JSON Web Token. Gabarito da Prática 2:
  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.

Capitulo Anterior | Proximo Capitulo