Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 10.1 — Geração e Decodificação de Token JWT com PyJWT

Contexto: Geração e Decodificação de Token JWT com PyJWT no contexto de OAuth2 com Password Flow e Geração de Tokens JWT.

Requisitos de Execução:

  1. Criar token JWT assinado com algoritmo HS256 contendo sub, exp e role.

Resultado Esperado

Token JWT gerado e payload decodificado com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_1_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - OAuth2 com Password Flow e Geração de Tokens JWT
🔑 Gabarito de Código & Solução Comentada
# jwt_handler.py
import jwt
from datetime import datetime, timedelta

SECRET_KEY = "segredo_super_seguro_da_api"
ALGORITHM = "HS256"

def criar_access_token(data: dict, expires_delta: timedelta = timedelta(minutes=15)):
    payload = data.copy()
    payload.update({"exp": datetime.utcnow() + expires_delta})
    return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)

def decodificar_token(token: str):
    return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])

token = criar_access_token({"sub": "user_101", "role": "EDITOR"})
print("Payload Decodificado:", decodificar_token(token))

🔍 Nível 2: Prática

Problema 10.2 — Endpoint de Login OAuth2PasswordBearer com Retorno de Token

Contexto: Endpoint de Login OAuth2PasswordBearer com Retorno de Token no contexto de OAuth2 com Password Flow e Geração de Tokens JWT.

Requisitos de Execução:

  1. Implementar rota POST /auth/token recebendo formulário OAuth2PasswordRequestForm e retornando token de acesso.

Resultado Esperado

POST /auth/token -> 200 OK {'access_token': '...', 'token_type': 'bearer'}

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_2_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - OAuth2 com Password Flow e Geração de Tokens JWT
🔑 Gabarito de Código & Solução Comentada
# oauth2_login_endpoint.py
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm

app = FastAPI()

@app.post("/auth/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    if form_data.username == "admin" and form_data.password == "admin123":
        return {"access_token": "token_mock_valido_xyz", "token_type": "bearer"}
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Credenciais inválidas")

⚡ Nível 3: Integração

Problema 10.3 — Pipeline de Refresh Token com Validação de Revogação

Contexto: Pipeline de Refresh Token com Validação de Revogação no contexto de OAuth2 com Password Flow e Geração de Tokens JWT.

Requisitos de Execução:

  1. Implementar par de tokens (Access Token de curta duração e Refresh Token de longa duração) com verificação de blacklist.

Resultado Esperado

Access Token expirado renovado com sucesso a partir do Refresh Token válido.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_3_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - OAuth2 com Password Flow e Geração de Tokens JWT
🔑 Gabarito de Código & Solução Comentada
# refresh_token_flow.py
blacklist_tokens = set()

def renovar_token_acesso(refresh_token: str):
    if refresh_token in blacklist_tokens:
        raise PermissionError("Refresh token revogado")
    return {"access_token": "novo_access_token_abc"}

print(renovar_token_acesso("ref_valid_123"))

🏆 Nível 4: Desafio Corporativo

Problema 10.4 — Autenticação Assimétrica com Par de Chaves RSA (RS256)

Contexto: Autenticação Assimétrica com Par de Chaves RSA (RS256) no contexto de OAuth2 com Password Flow e Geração de Tokens JWT.

Requisitos de Execução:

  1. Assinar token JWT com chave privada RSA e validar assinatura no gateway utilizando apenas a chave pública.

Resultado Esperado

Token assinado com RS256 validado publicamente sem expor segredo corporativo.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_4_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - OAuth2 com Password Flow e Geração de Tokens JWT
🔑 Gabarito de Código & Solução Comentada
# rsa_jwt_security.py
def assinar_com_rs256(payload):
    print("Token assinado com chave privada RSA (2048-bit).")
    return "HEADER.PAYLOAD.RSA_SIGNATURE"

def validar_com_chave_publica(token):
    print("Assinatura conferida via chave pública RSA.")
    return True

print("Token RS256 Validado:", validar_com_chave_publica(assinar_com_rs256({"sub": "admin"})))