Skip to content

Commit 0c45421

Browse files
committed
Merge tokens
1 parent 43ae801 commit 0c45421

28 files changed

+769
-274
lines changed

Backend/copia

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ENV="DEV"
2+
ROOT_PATH_DEV=""
3+
ROOT_PATH_PROD="/api"
4+
DB_URL="sqlite:///./src/mi-db-sqlite.db"
5+
MQTT_TOPIC="test_topic"
6+
MQTT_HOST="localhost"
7+
MQTT_PORT=1883
8+
MQTT_KEEPALIVE=60
9+
10+
SECRET_KEY="your_secret_key"
11+
ALGORITHM="HS256"

Backend/src/main.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ def login(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]):
8585
@app.get("/users/profile")
8686
def profile(my_user: Annotated[dict, Depends(decode_token)]):
8787
return my_user
88+
'''#PARA HACER LA REDIRECCION
89+
@app.get("/protected-route")
90+
def check_auth():
91+
raise HTTPException(
92+
status_code=401,
93+
detail="Usuario no autenticado. Redirigir al login."
94+
)'''
8895

8996

9097
def mi_callback(mensaje: str) -> None:

Backend/src/nodo/auth/__init__.py

Whitespace-only changes.

Backend/src/nodo/auth/crud.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# src/nodo/auth/crud.py
2+
from sqlalchemy.orm import Session
3+
from src.nodo import models
4+
from . import hashing
5+
6+
def get_user_by_username(db: Session, username: str):
7+
return db.query(models.Registro).filter(models.Registro.username == username).first()
8+
9+
def create_user(db: Session, username: str, password: str):
10+
hashed_password = hashing.hash_password(password)
11+
db_user = models.Registro(username=username, password=hashed_password)
12+
db.add(db_user)
13+
db.commit()
14+
db.refresh(db_user)
15+
return db_user

Backend/src/nodo/auth/hashing.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# src/nodo/auth/hashing.py
2+
from passlib.context import CryptContext
3+
4+
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
5+
6+
def hash_password(password: str):
7+
return pwd_context.hash(password)
8+
9+
def verify_password(plain_password: str, hashed_password: str):
10+
return pwd_context.verify(plain_password, hashed_password)

Backend/src/nodo/auth/jwt.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
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+
)

Backend/src/nodo/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ class Medicion(BaseModel):
5757
class Registro(BaseModel):
5858
__tablename__ = 'registros'
5959

60-
usuario = Column(String(10), primary_key=True)
61-
contrasenia = Column(String(8), nullable=False)
60+
username = Column(String(10), primary_key=True)
61+
password = Column(String(8), nullable=False)
6262

6363
# Modelo para Alerta
6464
class Alerta(BaseModel):

0 commit comments

Comments
 (0)