197 lines
6.2 KiB
Python
197 lines
6.2 KiB
Python
# auth.py
|
|
"""
|
|
Основной модуль системы авторизации
|
|
"""
|
|
from flask import Flask, request, jsonify
|
|
from flask_cors import CORS
|
|
from typing import Dict, Any
|
|
import database
|
|
import validators
|
|
from config import DEBUG_MODE
|
|
|
|
|
|
def debug_log(message: str) -> None:
|
|
"""Вывод отладочных сообщений"""
|
|
if DEBUG_MODE:
|
|
print(f"[DEBUG] {message}")
|
|
|
|
|
|
# Инициализация Flask приложения
|
|
app = Flask(__name__)
|
|
CORS(app) # Разрешаем CORS для Vue/React
|
|
|
|
# Инициализация базы данных при запуске
|
|
database.init_database()
|
|
|
|
|
|
@app.route('/api/register', methods=['POST'])
|
|
def register() -> Dict[str, Any]:
|
|
"""
|
|
Эндпоинт регистрации нового пользователя
|
|
|
|
Ожидаемые данные (JSON):
|
|
{
|
|
"username": "user_login",
|
|
"password": "user_password",
|
|
"password_confirm": "user_password"
|
|
}
|
|
|
|
Возвращает (JSON):
|
|
{
|
|
"success": true/false,
|
|
"message": "сообщение",
|
|
"errors": {...} # при наличии ошибок валидации
|
|
}
|
|
"""
|
|
debug_log("=== Запрос на регистрацию ===")
|
|
|
|
try:
|
|
data = request.get_json()
|
|
debug_log(f"Получены данные: username={data.get('username')}")
|
|
|
|
username = data.get('username', '').strip()
|
|
password = data.get('password', '')
|
|
password_confirm = data.get('password_confirm', '')
|
|
|
|
errors = {}
|
|
|
|
# Валидация логина
|
|
is_valid_username, username_error = validators.validate_username(username)
|
|
if not is_valid_username:
|
|
errors['username'] = username_error
|
|
|
|
# Валидация пароля
|
|
is_valid_password, password_error = validators.validate_password(password)
|
|
if not is_valid_password:
|
|
errors['password'] = password_error
|
|
|
|
# Проверка совпадения паролей
|
|
is_passwords_match, match_error = validators.validate_password_confirmation(
|
|
password, password_confirm
|
|
)
|
|
if not is_passwords_match:
|
|
errors['password_confirm'] = match_error
|
|
|
|
# Если есть ошибки валидации
|
|
if errors:
|
|
debug_log(f"Ошибки валидации: {errors}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': 'Ошибки валидации данных',
|
|
'errors': errors
|
|
}), 400
|
|
|
|
# Создание пользователя
|
|
success, message = database.create_user(username, password)
|
|
|
|
if success:
|
|
debug_log("Регистрация завершена успешно")
|
|
return jsonify({
|
|
'success': True,
|
|
'message': message
|
|
}), 201
|
|
else:
|
|
debug_log(f"Ошибка регистрации: {message}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': message
|
|
}), 400
|
|
|
|
except Exception as e:
|
|
debug_log(f"Необработанная ошибка: {e}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': 'Внутренняя ошибка сервера'
|
|
}), 500
|
|
|
|
|
|
@app.route('/api/login', methods=['POST'])
|
|
def login() -> Dict[str, Any]:
|
|
"""
|
|
Эндпоинт входа пользователя
|
|
|
|
Ожидаемые данные (JSON):
|
|
{
|
|
"username": "user_login",
|
|
"password": "user_password"
|
|
}
|
|
|
|
Возвращает (JSON):
|
|
{
|
|
"success": true/false,
|
|
"message": "сообщение",
|
|
"user": {...} # данные пользователя при успехе
|
|
}
|
|
"""
|
|
debug_log("=== Запрос на вход ===")
|
|
|
|
try:
|
|
data = request.get_json()
|
|
debug_log(f"Получены данные: username={data.get('username')}")
|
|
|
|
username = data.get('username', '').strip()
|
|
password = data.get('password', '')
|
|
|
|
errors = {}
|
|
|
|
# Валидация логина
|
|
is_valid_username, username_error = validators.validate_username(username)
|
|
if not is_valid_username:
|
|
errors['username'] = username_error
|
|
|
|
# Валидация пароля
|
|
is_valid_password, password_error = validators.validate_password(password)
|
|
if not is_valid_password:
|
|
errors['password'] = password_error
|
|
|
|
# Если есть ошибки валидации
|
|
if errors:
|
|
debug_log(f"Ошибки валидации: {errors}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': 'Ошибки валидации данных',
|
|
'errors': errors
|
|
}), 400
|
|
|
|
# Проверка учетных данных
|
|
success, message = database.verify_user(username, password)
|
|
|
|
if success:
|
|
debug_log("Вход выполнен успешно")
|
|
return jsonify({
|
|
'success': True,
|
|
'message': message,
|
|
'user': {
|
|
'username': username
|
|
}
|
|
}), 200
|
|
else:
|
|
debug_log(f"Ошибка входа: {message}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': message
|
|
}), 401
|
|
|
|
except Exception as e:
|
|
debug_log(f"Необработанная ошибка: {e}")
|
|
return jsonify({
|
|
'success': False,
|
|
'message': 'Внутренняя ошибка сервера'
|
|
}), 500
|
|
|
|
|
|
@app.route('/api/health', methods=['GET'])
|
|
def health_check():
|
|
"""Проверка работоспособности API"""
|
|
return jsonify({
|
|
'status': 'ok',
|
|
'message': 'API работает'
|
|
}), 200
|
|
|
|
|
|
if __name__ == '__main__':
|
|
debug_log("=== Запуск сервера авторизации ===")
|
|
debug_log(f"DEBUG_MODE: {DEBUG_MODE}")
|
|
app.run(debug=DEBUG_MODE, host='0.0.0.0', port=5000)
|
|
|