morphos / backend /app /security /device.py
Jose Salazar
Aislar por cl铆nica los resultados de analizador
1339cdc
Raw
History Blame Contribute Delete
1.52 kB
"""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