Files
tbcmap/auth.py

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)