📊 Capítulo 10: OAuth2 & JWT Stateless
Especialização Backend com Python & FastAPI
🗺️ O Fluxo de Autenticação OAuth2 Password Flow com JWT
sequenceDiagram
autonumber
actor C as Cliente / Frontend
participant API as FastAPI (@router.post /login)
participant SEC as TokenService (PyJWT / python-jose)
participant EP as Endpoint Protegido (Depends)
C->>API: POST /token (username, password via form-data)
API->>API: Valida credenciais no banco com verify_password()
API->>SEC: gerar_access_token({"sub": "user@email.com", "exp": ...})
SEC-->>API: Retorna string JWT criptografada
API-->>C: HTTP 200 {"access_token": "...", "token_type": "bearer"}
Note over C,EP: Requisições subsequentes autenticadas
C->>EP: GET /perfil Header "Authorization: Bearer <Token>"
EP->>SEC: Decodifica e valida assinatura e expiração
EP-->>C: Retorna Dados Protegidos
🎯 Slide 1: Integração Nativa com OAuth2PasswordBearer
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi import Depends, HTTPException, status
import jwt
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/token")
async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except jwt.PyJWTError:
raise credentials_exception
return await usuario_service.buscar_por_email(username)
🎯 Slide 2: Boas Práticas Estritas de Segurança JWT
-
SECRET_KEYCriptográfica Forte: Mínimo de 256 bits gerados aleatoriamente comopenssl rand -hex 32. -
Tempo de Vida Curto: Token de acesso expira em 15 a 30 minutos.
- Assinatura Exclusiva: Use algoritmos comprovados como
HS256ouRS256(Chave Pública/Privada).
🎯 Slide 3: Integração Automática com a Interface Swagger
- Ao usar
OAuth2PasswordBearer, a documentação interativa do Swagger UI (/docs) ganha o botão Authorize 🔓, permitindo testar rotas autenticadas visualmente com um clique!
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim