AIdeaText commited on
Commit
808f31e
verified
1 Parent(s): aeefc06

Update modules/auth/auth.py

Browse files
Files changed (1) hide show
  1. modules/auth/auth.py +177 -119
modules/auth/auth.py CHANGED
@@ -1,119 +1,177 @@
1
- import os
2
- from azure.cosmos import CosmosClient, exceptions
3
- from azure.cosmos.exceptions import CosmosHttpResponseError
4
- import bcrypt
5
- import base64
6
- from ..database.sql_db import (
7
- get_user,
8
- get_student_user,
9
- get_admin_user,
10
- get_teacher_user,
11
- create_student_user,
12
- update_student_user,
13
- delete_student_user
14
- )
15
-
16
- import logging
17
-
18
- logger = logging.getLogger(__name__)
19
-
20
- # ... (c贸digo de inicializaci贸n)
21
- def clean_and_validate_key(key):
22
- key = key.strip()
23
- while len(key) % 4 != 0:
24
- key += '='
25
- try:
26
- base64.b64decode(key)
27
- return key
28
- except:
29
- raise ValueError("La clave proporcionada no es v谩lida")
30
-
31
- # Verificar las variables de entorno
32
- endpoint = os.getenv("COSMOS_ENDPOINT")
33
- key = os.getenv("COSMOS_KEY")
34
-
35
- if not endpoint or not key:
36
- raise ValueError("Las variables de entorno COSMOS_ENDPOINT y COSMOS_KEY deben estar configuradas")
37
-
38
- key = clean_and_validate_key(key)
39
- ####################################################
40
-
41
-
42
- def authenticate_user(username, password):
43
- try:
44
- user_item = get_user(username)
45
- if user_item and verify_password(user_item['password'], password):
46
- logger.info(f"Usuario autenticado: {username}, Rol: {user_item['role']}")
47
- return True, user_item['role']
48
- logger.warning(f"Autenticaci贸n fallida para el usuario: {username}")
49
- return False, None
50
- except Exception as e:
51
- logger.error(f"Error durante la autenticaci贸n del usuario: {str(e)}")
52
- return False, None
53
-
54
- def authenticate_admin(username, password):
55
- return authenticate_user(username, password)
56
-
57
- def authenticate_student(username, password):
58
- return authenticate_user(username, password)
59
-
60
- def authenticate_teacher(username, password):
61
- return authenticate_user(username, password)
62
-
63
- ############################
64
- def register_student(username, password, additional_info=None):
65
- try:
66
- if get_student_user(username):
67
- logger.warning(f"Intento de registro de estudiante existente: {username}")
68
- return False # El estudiante ya existe
69
-
70
- success = create_student_user(username, password, additional_info)
71
- if success:
72
- logger.info(f"Nuevo estudiante registrado: {username}")
73
- return True
74
- else:
75
- logger.error(f"Error al registrar nuevo estudiante: {username}")
76
- return False
77
- except Exception as e:
78
- logger.error(f"Error al registrar estudiante: {str(e)}")
79
- return False
80
-
81
- def update_student_info(username, new_info):
82
- try:
83
- success = update_student_user(username, new_info)
84
- if success:
85
- logger.info(f"Informaci贸n del estudiante actualizada: {username}")
86
- return True
87
- else:
88
- logger.error(f"Error al actualizar informaci贸n del estudiante: {username}")
89
- return False
90
- except Exception as e:
91
- logger.error(f"Error al actualizar informaci贸n del estudiante: {str(e)}")
92
- return False
93
-
94
- def delete_student(username):
95
- try:
96
- success = delete_student_user(username)
97
- if success:
98
- logger.info(f"Estudiante eliminado: {username}")
99
- return True
100
- else:
101
- logger.error(f"Error al eliminar estudiante: {username}")
102
- return False
103
- except Exception as e:
104
- logger.error(f"Error al eliminar estudiante: {str(e)}")
105
- return False
106
-
107
-
108
- # ... (funciones de hash y verificaci贸n de contrase帽a)
109
-
110
- def hash_password(password):
111
- """Hash a password for storing."""
112
- return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
113
-
114
- ##################################################################################33
115
-
116
- def verify_password(stored_password, provided_password):
117
- """Verify a stored password against one provided by user"""
118
- return bcrypt.checkpw(provided_password.encode('utf-8'), stored_password.encode('utf-8'))
119
- ######################################################################################################
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import streamlit as st
3
+ from azure.cosmos import CosmosClient, exceptions
4
+ from azure.cosmos.exceptions import CosmosHttpResponseError
5
+ import bcrypt
6
+ import base64
7
+ import logging
8
+ from datetime import datetime, timezone
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ def clean_and_validate_key(key):
13
+ """Limpia y valida la clave de CosmosDB"""
14
+ key = key.strip()
15
+ while len(key) % 4 != 0:
16
+ key += '='
17
+ try:
18
+ base64.b64decode(key)
19
+ return key
20
+ except:
21
+ raise ValueError("La clave proporcionada no es v谩lida")
22
+
23
+ # Verificar las variables de entorno
24
+ endpoint = os.getenv("COSMOS_ENDPOINT")
25
+ key = os.getenv("COSMOS_KEY")
26
+
27
+ if not endpoint or not key:
28
+ raise ValueError("Las variables de entorno COSMOS_ENDPOINT y COSMOS_KEY deben estar configuradas")
29
+
30
+ key = clean_and_validate_key(key)
31
+
32
+ def authenticate_user(username, password):
33
+ """
34
+ Autentica un usuario y registra el inicio de sesi贸n
35
+ """
36
+ try:
37
+ user_item = get_user(username)
38
+ if user_item and verify_password(user_item['password'], password):
39
+ logger.info(f"Usuario autenticado: {username}, Rol: {user_item['role']}")
40
+
41
+ # Registrar inicio de sesi贸n
42
+ session_id = record_login(username)
43
+ if session_id:
44
+ st.session_state.session_id = session_id
45
+ st.session_state.login_time = datetime.now(timezone.utc).isoformat()
46
+
47
+ return True, user_item['role']
48
+
49
+ logger.warning(f"Autenticaci贸n fallida para el usuario: {username}")
50
+ return False, None
51
+ except Exception as e:
52
+ logger.error(f"Error durante la autenticaci贸n del usuario: {str(e)}")
53
+ return False, None
54
+
55
+ def authenticate_admin(username, password):
56
+ """Autentica un administrador"""
57
+ return authenticate_user(username, password)
58
+
59
+ def authenticate_student(username, password):
60
+ """Autentica un estudiante"""
61
+ return authenticate_user(username, password)
62
+
63
+ def authenticate_teacher(username, password):
64
+ """Autentica un profesor"""
65
+ return authenticate_user(username, password)
66
+
67
+ def register_student(username, password, additional_info=None):
68
+ """
69
+ Registra un nuevo estudiante
70
+ """
71
+ try:
72
+ if get_student_user(username):
73
+ logger.warning(f"Intento de registro de estudiante existente: {username}")
74
+ return False
75
+
76
+ # Hash de la contrase帽a antes de almacenar
77
+ hashed_password = hash_password(password)
78
+ success = create_student_user(username, hashed_password, additional_info)
79
+
80
+ if success:
81
+ logger.info(f"Nuevo estudiante registrado: {username}")
82
+ return True
83
+ else:
84
+ logger.error(f"Error al registrar nuevo estudiante: {username}")
85
+ return False
86
+ except Exception as e:
87
+ logger.error(f"Error al registrar estudiante: {str(e)}")
88
+ return False
89
+
90
+ def update_student_info(username, new_info):
91
+ """
92
+ Actualiza la informaci贸n de un estudiante
93
+ """
94
+ try:
95
+ # Si hay contrase帽a en new_info, hashearla
96
+ if 'password' in new_info:
97
+ new_info['password'] = hash_password(new_info['password'])
98
+
99
+ success = update_student_user(username, new_info)
100
+ if success:
101
+ logger.info(f"Informaci贸n del estudiante actualizada: {username}")
102
+ return True
103
+ else:
104
+ logger.error(f"Error al actualizar informaci贸n del estudiante: {username}")
105
+ return False
106
+ except Exception as e:
107
+ logger.error(f"Error al actualizar informaci贸n del estudiante: {str(e)}")
108
+ return False
109
+
110
+ def delete_student(username):
111
+ """
112
+ Elimina un estudiante
113
+ """
114
+ try:
115
+ success = delete_student_user(username)
116
+ if success:
117
+ logger.info(f"Estudiante eliminado: {username}")
118
+ return True
119
+ else:
120
+ logger.error(f"Error al eliminar estudiante: {username}")
121
+ return False
122
+ except Exception as e:
123
+ logger.error(f"Error al eliminar estudiante: {str(e)}")
124
+ return False
125
+
126
+ def logout():
127
+ """
128
+ Cierra la sesi贸n del usuario y registra el tiempo
129
+ """
130
+ try:
131
+ if 'session_id' in st.session_state and 'username' in st.session_state:
132
+ # Registrar el cierre de sesi贸n
133
+ record_logout(
134
+ st.session_state.username,
135
+ st.session_state.session_id
136
+ )
137
+ logger.info(f"Sesi贸n cerrada para el usuario: {st.session_state.username}")
138
+
139
+ # Limpiar el estado de la sesi贸n
140
+ st.session_state.clear()
141
+
142
+ except Exception as e:
143
+ logger.error(f"Error durante el logout: {str(e)}")
144
+ # Asegurar que la sesi贸n se limpie incluso si hay error
145
+ st.session_state.clear()
146
+
147
+ def hash_password(password):
148
+ """
149
+ Hashea una contrase帽a para almacenamiento
150
+ """
151
+ return bcrypt.hashpw(
152
+ password.encode('utf-8'),
153
+ bcrypt.gensalt()
154
+ ).decode('utf-8')
155
+
156
+ def verify_password(stored_password, provided_password):
157
+ """
158
+ Verifica una contrase帽a almacenada contra una proporcionada
159
+ """
160
+ return bcrypt.checkpw(
161
+ provided_password.encode('utf-8'),
162
+ stored_password.encode('utf-8')
163
+ )
164
+
165
+ # Asegurarse de exportar todas las funciones necesarias
166
+ __all__ = [
167
+ 'authenticate_user',
168
+ 'authenticate_admin',
169
+ 'authenticate_student',
170
+ 'authenticate_teacher',
171
+ 'register_student',
172
+ 'update_student_info',
173
+ 'delete_student',
174
+ 'logout',
175
+ 'hash_password',
176
+ 'verify_password'
177
+ ]