Coverage for backend \ app \ configuracionGeneral \ seguridadJWT.py: 67.39%
46 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-29 16:13 -0500
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-29 16:13 -0500
1# Librerias para manejar JWT
2import os
3from datetime import datetime, timedelta, timezone
4from jose import JWTError, jwt # Librerias para manejar JWT
6from fastapi import Depends, HTTPException,Request
7from fastapi.security import OAuth2PasswordBearer
10from app.configuracionGeneral.errores import ERROR_TOKEN_INVALIDO
14SECRET_KEY = os.environ.get("SECRET_KEY","secreto")
15ALGORITHM = os.environ.get("ALGORITHM","HS256")
16ACCESS_TOKEN_EXPIRE_MINUTES = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", 30))
17#Todas las funciones con camelCase y español
19def crearTokenJWT(datos:dict)->str:
20 quitoTZ=timezone(timedelta(hours=-5)) # Se obtiene la zona horaria de Ecuador
21 payload = datos.copy() # Datos iniciales para el token
22 fechaActual = datetime.now(quitoTZ)
23 expira = fechaActual + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
25 # Agregar al payload del token las fechas
26 payload["exp"] = expira
27 payload["iat"] = fechaActual
29 token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
30 return token
32def verificarToken(token: str) -> dict:
33 return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
36oauth2Scheme = OAuth2PasswordBearer(tokenUrl="/usuarios/loginSwagger",auto_error=False)
41#Validador de token y permisos según el rol
42permisos = {
43 "Prueba": {"Administrador": "ALL", "Bodeguero": "ALL", "Cajero": "ALL"},
44 "ParametrosSistema": {"Administrador": "ALL", "Bodeguero": [], "Cajero": []},
45 "Usuarios": {"Administrador": "ALL", "Bodeguero": [], "Cajero": []},
46 "Productos": {"Administrador": "ALL", "Bodeguero": "ALL", "Cajero": ["GET"]},
47 "Inventario": {"Administrador": ["ALL","GET","POST","PUT","DELETE"], "Bodeguero": ["GET","POST","PUT"], "Cajero": ["GET"]},
48 "Pedido": {"Administrador": ["ALL","GET","POST","PUT","DELETE"], "Bodeguero": ["ALL","GET","POST","PUT","DELETE"], "Cajero": []},
49 "Promocion": {"Administrador": ["ALL","GET","POST","PUT","DELETE"], "Bodeguero": [], "Cajero": ["GET"]},
50 "Venta": {"Administrador": ["ALL","GET","POST","PUT","DELETE"], "Bodeguero": [], "Cajero": ["ALL","GET","POST","PUT","DELETE"]},
51 "Cliente": {"Administrador": "ALL", "Bodeguero": [], "Cajero": "ALL"},
52 "Caja": {"Administrador": ["ALL","GET","POST","PUT","DELETE"], "Bodeguero": [], "Cajero": ["GET","POST","PUT"]},
53 "Reportes": {
54 "Administrador": ["GET_Stock","GET_Ventas","GET_Caja","GET_Clientes"],
55 "Bodeguero": ["GET_Stock"],
56 "Cajero": []
57 },
58}
61def identificarUsuarioString(usuario: dict) -> str:
62 """Devuelve la identificación formateada como 'id-Nombre Completo' si es posible."""
63 if not usuario:
64 return ""
65 idu = usuario.get("idUsuario")
66 nombre = usuario.get("nombreCompleto") or usuario.get("usuario") or usuario.get("email") or ""
67 if idu is None:
68 return nombre
69 return f"{idu}-{nombre}"
72def protegerRuta(modulo: str, accion: str):
73 def dependencia(token: str = Depends(oauth2Scheme)):
74 if token is None:
75 raise HTTPException(
76 status_code=ERROR_TOKEN_INVALIDO.codigoHttp,
77 detail=ERROR_TOKEN_INVALIDO.mensaje
78 )
79 try:
80 usuario=verificarToken(token)
81 except JWTError:
82 raise HTTPException(
83 status_code=ERROR_TOKEN_INVALIDO.codigoHttp,
84 detail=ERROR_TOKEN_INVALIDO.mensaje
85 )
86 rol=usuario.get("rol")
87 print(rol)
88 rolPermiso=permisos.get(modulo, {}).get(rol, [])
89 print(rolPermiso)
90 if rolPermiso=="ALL" or accion in rolPermiso:
91 return usuario
92 else:
93 raise HTTPException(
94 status_code=403,
95 detail="No tienes permiso para acceder a esta ruta"
96 )
97 return dependencia