# 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)