Files
pdf-toolkit/core/auth.py
CM Consultor e97adca143 fix: compressão real p/ stream DCTDecode + auth c/ chave vazia
- Substitui xobj._data por page.images[].replace() em compress.py e pdfa.py
- Adiciona compress_with_stats() com feedback honesto na UI
- Trata PDFTOOLKIT_API_KEY vazia como modo dev (auth desabilitado)
- Atualiza engine.py e app.py para exibir redução real ou 'já otimizado'
2026-08-09 05:01:16 +00:00

61 lines
1.8 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 **ou estiver vazia**, 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 ou vazia)
_API_KEY_CANDIDATE = os.environ.get(API_KEY_ENV, None)
_API_KEY = _API_KEY_CANDIDATE if _API_KEY_CANDIDATE else 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 ou está vazia → 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/403.
"""
# 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