1
+ # src/nodo/auth/jwt.py
2
+ from datetime import datetime , timedelta
3
+ from jose import JWTError , jwt
4
+ from src .config_db import get_db
5
+ from src .nodo .auth .crud import get_user_by_username
6
+ from fastapi import Depends , HTTPException , status , Request
7
+ from sqlalchemy .orm import Session
8
+ from fastapi .security import OAuth2PasswordBearer
9
+
10
+ SECRET_KEY = "mi_clave_secreta"
11
+ ALGORITHM = "HS256"
12
+ ACCESS_TOKEN_EXPIRE_MINUTES = 30
13
+
14
+ def create_access_token (data : dict ):
15
+ to_encode = data .copy ()
16
+ expire = datetime .utcnow () + timedelta (minutes = ACCESS_TOKEN_EXPIRE_MINUTES )
17
+ to_encode .update ({"exp" : expire })
18
+ encoded_jwt = jwt .encode (to_encode , SECRET_KEY , algorithm = ALGORITHM )
19
+ return encoded_jwt
20
+
21
+ '''def verify_token(token: str):
22
+ try:
23
+ payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
24
+ return payload if "exp" in payload and payload["exp"] >= datetime.utcnow().timestamp() else None
25
+ except JWTError:
26
+ return None
27
+
28
+ def get_cookie_token(request: Request):
29
+ token = request.cookies.get("access_token")
30
+ print (request.cookies)
31
+ if not token:
32
+ print("No se encontró token en las cookies, utilizando uno de prueba...")
33
+ token = "<tu_token_de_prueba>"
34
+ return token
35
+
36
+ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="iniciar_sesion")
37
+ def get_current_user(db: Session = Depends(get_db), token: str = Depends(get_cookie_token)):
38
+ try:
39
+ print(token)
40
+ payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
41
+ username: str = payload.get("sub")
42
+ if username is None:
43
+ raise HTTPException(
44
+ status_code=status.HTTP_401_UNAUTHORIZED,
45
+ detail="No se pudo validar el usuario",
46
+ headers={"WWW-Authenticate": "Bearer"},
47
+ )
48
+ # Obtener el usuario de la base de datos
49
+ user = get_user_by_username(db, username=username)
50
+ if user is None:
51
+ raise HTTPException(
52
+ status_code=status.HTTP_401_UNAUTHORIZED,
53
+ detail="Usuario no encontrado",
54
+ headers={"WWW-Authenticate": "Bearer"},
55
+ )
56
+ return user
57
+ except JWTError:
58
+ raise HTTPException(
59
+ status_code=status.HTTP_401_UNAUTHORIZED,
60
+ detail="Token inválido o expirado",
61
+ headers={"WWW-Authenticate": "Bearer"},
62
+ )'''
63
+
64
+
65
+ def verify_token (token : str ):
66
+ """
67
+ Verifica el token JWT y retorna el payload si es válido.
68
+ """
69
+ try :
70
+ # Configura para verificar automáticamente la expiración del token
71
+ payload = jwt .decode (token , SECRET_KEY , algorithms = [ALGORITHM ], options = {"verify_exp" : True })
72
+ return payload
73
+ except JWTError :
74
+ return None
75
+
76
+ def get_cookie_token (request : Request ):
77
+ token = request .cookies .get ("access_token" )
78
+ print ('TOKEN:' )
79
+ print (token )
80
+ if not token :
81
+ raise HTTPException (
82
+ status_code = status .HTTP_401_UNAUTHORIZED ,
83
+ detail = "No se encontró un token de acceso en las cookies." ,
84
+ )
85
+ if token .startswith ("Bearer " ):
86
+ token = token [len ("Bearer " ):]
87
+ print ("Token limpio:" , token ) # Debug
88
+ return token
89
+
90
+ def get_current_user (db : Session = Depends (get_db ), token : str = Depends (get_cookie_token )):
91
+ """
92
+ Valida el token JWT y retorna el usuario actual.
93
+ """
94
+ try :
95
+ payload = jwt .decode (token , SECRET_KEY , algorithms = [ALGORITHM ])
96
+ username : str = payload .get ("sub" )
97
+ if username is None :
98
+ raise HTTPException (
99
+ status_code = status .HTTP_401_UNAUTHORIZED ,
100
+ detail = "No se pudo validar el usuario" ,
101
+ headers = {"WWW-Authenticate" : "Bearer" },
102
+ )
103
+ # Obtener el usuario de la base de datos
104
+ user = get_user_by_username (db , username = username )
105
+ if user is None :
106
+ raise HTTPException (
107
+ status_code = status .HTTP_401_UNAUTHORIZED ,
108
+ detail = "Usuario no encontrado" ,
109
+ headers = {"WWW-Authenticate" : "Bearer" },
110
+ )
111
+ return user
112
+ except JWTError :
113
+ raise HTTPException (
114
+ status_code = status .HTTP_401_UNAUTHORIZED ,
115
+ detail = "Token inválido o expirado" ,
116
+ headers = {"WWW-Authenticate" : "Bearer" },
117
+ )
0 commit comments