🧩 Exercícios: OAuth2 com Password Flow e Geração de Tokens JWT
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:
- Criar token JWT assinado com algoritmo HS256 contendo
sub,experole.
Resultado Esperado
Token JWT gerado e payload decodificado com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_1_SeuNome - 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:
- Implementar rota POST
/auth/tokenrecebendo formulárioOAuth2PasswordRequestForme retornando token de acesso.
Resultado Esperado
POST /auth/token -> 200 OK {'access_token': '...', 'token_type': 'bearer'}
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_10_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_10_4_SeuNome - 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"})))