- core/auth.py: API Key auth via header X-API-Key (env PDFTOOLKIT_API_KEY) - Modo dev: sem chave configurada → acesso livre - Modo produção: exige chave, retorna 401/403 - api.py: endpoints protegidos com Depends(_auth_required) - /health e / permanecem públicos - Dockerfile: multi-stage (base → api → web) - docker-compose.yml: api + web com healthcheck, volumes e rede - .env.example: template de variáveis de ambiente - README.md: seções de autenticação e Docker
59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
"""
|
|
Autenticação via API Key para a API REST.
|
|
|
|
A chave é lida da variável de ambiente PDFTOOLKIT_API_KEY.
|
|
Se a variável não estiver definida, a autenticação fica desabilitada
|
|
(útil para desenvolvimento local).
|
|
|
|
Uso:
|
|
export PDFTOOLKIT_API_KEY="sua-chave-secreta-aqui"
|
|
"""
|
|
|
|
import os
|
|
from fastapi import Security, HTTPException, status
|
|
from fastapi.security import APIKeyHeader
|
|
|
|
API_KEY_ENV = "PDFTOOLKIT_API_KEY"
|
|
|
|
# Lê a chave do ambiente (None se não configurada)
|
|
_API_KEY = os.environ.get(API_KEY_ENV, None)
|
|
|
|
# Schema de header: X-API-Key
|
|
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
|
|
|
|
|
|
def verify_api_key(api_key: str = Security(api_key_header)) -> str:
|
|
"""
|
|
Dependência FastAPI que valida a API Key.
|
|
|
|
- Se PDFTOOLKIT_API_KEY não foi definida no ambiente → permite acesso livre
|
|
(modo desenvolvimento).
|
|
- Se foi definida → exige que o header X-API-Key corresponda exatamente.
|
|
|
|
Retorna a própria chave se válida, ou levanta 401.
|
|
"""
|
|
# Modo desenvolvimento: sem chave configurada
|
|
if _API_KEY is None:
|
|
return "dev-mode"
|
|
|
|
# Modo produção: exige chave
|
|
if api_key is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="API Key ausente. Envie o header X-API-Key.",
|
|
headers={"WWW-Authenticate": "ApiKey"},
|
|
)
|
|
|
|
if api_key != _API_KEY:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
detail="API Key inválida.",
|
|
headers={"WWW-Authenticate": "ApiKey"},
|
|
)
|
|
|
|
return api_key
|
|
|
|
|
|
def is_auth_enabled() -> bool:
|
|
"""Retorna True se a autenticação estiver ativa."""
|
|
return _API_KEY is not None |