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

1# Librerias para manejar JWT 

2import os 

3from datetime import datetime, timedelta, timezone 

4from jose import JWTError, jwt # Librerias para manejar JWT 

5 

6from fastapi import Depends, HTTPException,Request 

7from fastapi.security import OAuth2PasswordBearer 

8 

9 

10from app.configuracionGeneral.errores import ERROR_TOKEN_INVALIDO 

11 

12 

13 

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 

18 

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) 

24 

25 # Agregar al payload del token las fechas  

26 payload["exp"] = expira 

27 payload["iat"] = fechaActual 

28 

29 token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM) 

30 return token 

31 

32def verificarToken(token: str) -> dict: 

33 return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) 

34 

35 

36oauth2Scheme = OAuth2PasswordBearer(tokenUrl="/usuarios/loginSwagger",auto_error=False) 

37 

38 

39 

40 

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} 

59 

60 

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}" 

70 

71 

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 

98 

99