Spaces:
Sleeping
Sleeping
File size: 1,515 Bytes
70e641d 1339cdc 70e641d 1339cdc 70e641d 1339cdc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | """Autenticaci贸n del puente local (dispositivo headless) para la ingesta de laboratorio.
El puente no es un navegador: no tiene cookie de sesi贸n ni CSRF. Se autentica con una API
key por Bearer sobre HTTPS. Comparaci贸n en tiempo constante (misma disciplina que
verificar_password en db.py). Falla cerrado: sin keys configuradas, la ingesta no existe.
"""
from __future__ import annotations
from fastapi import Header, HTTPException, status
from ..config import obtener_config
def verificar_dispositivo(authorization: str | None = Header(default=None)) -> str:
"""Dependencia para /api/lab/ingesta: devuelve el TENANT due帽o de la clave.
Antes devolv铆a None y la clave era an贸nima: cualquier dispositivo escrib铆a en un almac茅n
global y cualquier sesi贸n lo le铆a. El tenant sale de la configuraci贸n del servidor, nunca
del cuerpo de la petici贸n: si el puente pudiera declarar su cl铆nica, bastar铆a mentir en un
campo para escribir en la de otro.
"""
cfg = obtener_config()
if not cfg.lab_api_keys:
raise HTTPException(
status.HTTP_503_SERVICE_UNAVAILABLE,
"Ingesta de laboratorio no configurada.",
)
token = ""
if authorization and authorization.lower().startswith("bearer "):
token = authorization[7:].strip()
tenant = cfg.tenant_de_clave_dispositivo(token) if token else None
if tenant is None:
raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Dispositivo no autorizado.")
return tenant
|