""" Login HTTP Basic. Duas fontes de credencial, checadas nessa ordem: 1. ADMIN_USER/ADMIN_PASSWORD (variáveis de ambiente) — conta única de bootstrap, útil para o primeiro acesso (cadastrar o primeiro funcionário em /funcionarios) e como plano B se a tabela de funcionários ficar vazia/inacessível. Continua exigindo as duas variáveis preenchidas (nunca autentica credencial vazia). 2. FUNCIONARIO_PAINEL (app/db/funcionarios.py) — conta individual por funcionário, com senha em hash (app/senha.py). Só autentica se ATIVO=1. Sem sessão/cookie — o próprio navegador guarda a credencial Basic. """ import os import secrets from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBasic, HTTPBasicCredentials from .db import funcionarios as db_funcionarios from .senha import verificar_senha _security = HTTPBasic() def exigir_login(credenciais: HTTPBasicCredentials = Depends(_security)) -> str: usuario_admin = os.environ.get("ADMIN_USER", "") senha_admin = os.environ.get("ADMIN_PASSWORD", "") if usuario_admin and senha_admin: usuario_ok = secrets.compare_digest(credenciais.username, usuario_admin) senha_ok = secrets.compare_digest(credenciais.password, senha_admin) if usuario_ok and senha_ok: return credenciais.username funcionario = db_funcionarios.obter_por_login(credenciais.username) if funcionario and funcionario["ATIVO"] and verificar_senha(credenciais.password, funcionario["SENHA_HASH"]): return funcionario["NOME"] raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Usuário ou senha inválidos.", headers={"WWW-Authenticate": "Basic"}, )