""" 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