Spaces:
Sleeping
Sleeping
| """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 | |