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