AIdeaText commited on
Commit
bedce85
verified
1 Parent(s): 6cddee1

Update modules/auth/auth.py

Browse files
Files changed (1) hide show
  1. modules/auth/auth.py +190 -26
modules/auth/auth.py CHANGED
@@ -1,33 +1,197 @@
1
  #/modules/auth/auth.py
2
 
 
 
 
 
 
 
3
  import bcrypt
4
- from modules.database.sql_db import get_user, create_user
5
- import gradio as gr
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  def authenticate_user(username, password):
8
- """Autentica a un usuario."""
9
- user = get_user(username)
10
- if user and bcrypt.checkpw(password.encode('utf-8'), user['password'].encode('utf-8')):
11
- return True, user['role']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  return False, None
13
 
14
- def register_user(username, password, role):
15
- """Registra un nuevo usuario."""
16
- hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
17
- return create_user(username, hashed_password, role)
18
-
19
- def create_auth_interface():
20
- """Crea la interfaz de autenticaci贸n."""
21
- with gr.Blocks() as auth_interface:
22
- gr.Markdown("# Login")
23
- username = gr.Textbox(label="Usuario")
24
- password = gr.Textbox(label="Contrase帽a", type="password")
25
- login_btn = gr.Button("Iniciar Sesi贸n")
26
- message = gr.Markdown()
27
-
28
- def handle_login(user, pwd):
29
- success, role = authenticate_user(user, pwd)
30
- return f"Bienvenido, {user} ({role})" if success else "Credenciales incorrectas."
31
-
32
- login_btn.click(fn=handle_login, inputs=[username, password], outputs=message)
33
- return auth_interface
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  #/modules/auth/auth.py
2
 
3
+ ##########modules/auth/auth.py
4
+
5
+ import os
6
+ import streamlit as st
7
+ from azure.cosmos import CosmosClient, exceptions
8
+ from azure.cosmos.exceptions import CosmosHttpResponseError
9
  import bcrypt
10
+ import base64
11
+ from ..database.sql_db import (
12
+ get_user,
13
+ get_student_user,
14
+ get_admin_user,
15
+ create_student_user,
16
+ update_student_user,
17
+ delete_student_user,
18
+ record_login,
19
+ record_logout
20
+ )
21
+
22
+ import logging
23
+
24
+ from datetime import datetime, timezone
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+ def clean_and_validate_key(key):
29
+ """Limpia y valida la clave de CosmosDB"""
30
+ key = key.strip()
31
+ while len(key) % 4 != 0:
32
+ key += '='
33
+ try:
34
+ base64.b64decode(key)
35
+ return key
36
+ except:
37
+ raise ValueError("La clave proporcionada no es v谩lida")
38
+
39
+ # Verificar las variables de entorno
40
+ endpoint = os.getenv("COSMOS_ENDPOINT")
41
+ key = os.getenv("COSMOS_KEY")
42
+
43
+ if not endpoint or not key:
44
+ raise ValueError("Las variables de entorno COSMOS_ENDPOINT y COSMOS_KEY deben estar configuradas")
45
+
46
+ key = clean_and_validate_key(key)
47
+
48
 
49
  def authenticate_user(username, password):
50
+ """Autentica un usuario y registra el inicio de sesi贸n"""
51
+ try:
52
+ user_item = get_user(username)
53
+
54
+ if not user_item:
55
+ logger.warning(f"Usuario no encontrado: {username}")
56
+ return False, None
57
+
58
+ if verify_password(user_item['password'], password):
59
+ logger.info(f"Usuario autenticado: {username}, Rol: {user_item['role']}")
60
+
61
+ try:
62
+ session_id = record_login(username)
63
+ if session_id:
64
+ st.session_state.session_id = session_id
65
+ st.session_state.username = username
66
+ st.session_state.login_time = datetime.now(timezone.utc).isoformat()
67
+ logger.info(f"Sesi贸n iniciada: {session_id}")
68
+ else:
69
+ logger.warning("No se pudo registrar la sesi贸n")
70
+ except Exception as e:
71
+ logger.error(f"Error al registrar inicio de sesi贸n: {str(e)}")
72
+
73
+ return True, user_item['role']
74
+
75
+ logger.warning(f"Contrase帽a incorrecta para usuario: {username}")
76
+ return False, None
77
+
78
+ except Exception as e:
79
+ logger.error(f"Error durante la autenticaci贸n del usuario: {str(e)}")
80
+ return False, None
81
+
82
+ def authenticate_student(username, password):
83
+ """Autentica un estudiante"""
84
+ success, role = authenticate_user(username, password)
85
+ if success and role == 'Estudiante':
86
+ return True, role
87
  return False, None
88
 
89
+ def authenticate_admin(username, password):
90
+ """Autentica un administrador"""
91
+ success, role = authenticate_user(username, password)
92
+ if success and role == 'Administrador':
93
+ return True, role
94
+ return False, None
95
+
96
+ def register_student(username, password, additional_info=None):
97
+ """Registra un nuevo estudiante"""
98
+ try:
99
+ if get_student_user(username):
100
+ logger.warning(f"Estudiante ya existe: {username}")
101
+ return False
102
+
103
+ hashed_password = hash_password(password)
104
+
105
+ # Asegurarse que additional_info tenga el rol correcto
106
+ if not additional_info:
107
+ additional_info = {}
108
+ additional_info['role'] = 'Estudiante'
109
+
110
+ success = create_student_user(username, hashed_password, additional_info)
111
+ if success:
112
+ logger.info(f"Nuevo estudiante registrado: {username}")
113
+ return True
114
+
115
+ logger.error(f"Error al crear estudiante: {username}")
116
+ return False
117
+
118
+ except Exception as e:
119
+ logger.error(f"Error al registrar estudiante: {str(e)}")
120
+ return False
121
+
122
+ def update_student_info(username, new_info):
123
+ """Actualiza la informaci贸n de un estudiante"""
124
+ try:
125
+ if 'password' in new_info:
126
+ new_info['password'] = hash_password(new_info['password'])
127
+
128
+ success = update_student_user(username, new_info)
129
+ if success:
130
+ logger.info(f"Informaci贸n actualizada: {username}")
131
+ return True
132
+
133
+ logger.error(f"Error al actualizar: {username}")
134
+ return False
135
+
136
+ except Exception as e:
137
+ logger.error(f"Error en actualizaci贸n: {str(e)}")
138
+ return False
139
+
140
+ def delete_student(username):
141
+ """Elimina un estudiante"""
142
+ try:
143
+ success = delete_student_user(username)
144
+ if success:
145
+ logger.info(f"Estudiante eliminado: {username}")
146
+ return True
147
+
148
+ logger.error(f"Error al eliminar: {username}")
149
+ return False
150
+
151
+ except Exception as e:
152
+ logger.error(f"Error en eliminaci贸n: {str(e)}")
153
+ return False
154
+
155
+ def logout():
156
+ """Cierra la sesi贸n del usuario"""
157
+ try:
158
+ if 'session_id' in st.session_state and 'username' in st.session_state:
159
+ success = record_logout(
160
+ st.session_state.username,
161
+ st.session_state.session_id
162
+ )
163
+ if success:
164
+ logger.info(f"Sesi贸n cerrada: {st.session_state.username}")
165
+ else:
166
+ logger.warning(f"Error al registrar cierre de sesi贸n: {st.session_state.username}")
167
+
168
+ except Exception as e:
169
+ logger.error(f"Error en logout: {str(e)}")
170
+ finally:
171
+ st.session_state.clear()
172
+
173
+ def hash_password(password):
174
+ """Hashea una contrase帽a"""
175
+ return bcrypt.hashpw(
176
+ password.encode('utf-8'),
177
+ bcrypt.gensalt()
178
+ ).decode('utf-8')
179
+
180
+ def verify_password(stored_password, provided_password):
181
+ """Verifica una contrase帽a"""
182
+ return bcrypt.checkpw(
183
+ provided_password.encode('utf-8'),
184
+ stored_password.encode('utf-8')
185
+ )
186
+
187
+ __all__ = [
188
+ 'authenticate_user',
189
+ 'authenticate_admin',
190
+ 'authenticate_student',
191
+ 'register_student',
192
+ 'update_student_info',
193
+ 'delete_student',
194
+ 'logout',
195
+ 'hash_password',
196
+ 'verify_password'
197
+ ]