Восстановление репозитория
This commit is contained in:
196
auth.py
Normal file
196
auth.py
Normal file
@@ -0,0 +1,196 @@
|
||||
# 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)
|
||||
|
||||
75
help.md
Normal file
75
help.md
Normal file
@@ -0,0 +1,75 @@
|
||||
'''Это копипаста из перплексити, чтобы можно было потестить API без фронтенда. В целом всё работает, и даже очень хорошо работает'''
|
||||
|
||||
Установите зависимости:
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Запустите бэкенд-сервер:
|
||||
|
||||
```bash
|
||||
python auth.py
|
||||
```
|
||||
Сервер запустится на http://localhost:5000.
|
||||
|
||||
|
||||
Тестирование API
|
||||
Вы можете протестировать API с помощью curl, Postman или прямо из браузера:
|
||||
|
||||
Проверка работоспособности:
|
||||
|
||||
```bash
|
||||
curl http://localhost:5000/api/health
|
||||
```
|
||||
|
||||
Регистрация:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:5000/api/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"testuser","password":"Test123456","password_confirm":"Test123456"}'
|
||||
```
|
||||
|
||||
Вход:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:5000/api/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"testuser","password":"Test123456"}'
|
||||
```
|
||||
|
||||
Примеры ответов API
|
||||
Успешная регистрация:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Регистрация успешна"
|
||||
}
|
||||
```
|
||||
|
||||
Ошибка валидации:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": "Ошибки валидации данных",
|
||||
"errors": {
|
||||
"username": "Логин должен содержать минимум 4 символа",
|
||||
"password": "Пароль должен содержать минимум 8 символов, латинские буквы и цифры"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Успешный вход:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Вход выполнен успешно",
|
||||
"user": {
|
||||
"username": "testuser"
|
||||
}
|
||||
}
|
||||
```
|
||||
3
link.txt
Normal file
3
link.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
https://www.perplexity.ai/spaces/tbcmap-GaQAgp1FQ5W.SaTuw2POrw#0
|
||||
|
||||
'''Это ссылка на пространство перплексити, где я буду писать код и планировать структуру проекта'''
|
||||
25
main.py
Normal file
25
main.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# main.py
|
||||
"""
|
||||
Основное окно приложения (шаблон)
|
||||
Будет открываться после успешной авторизации
|
||||
"""
|
||||
|
||||
|
||||
def main_window():
|
||||
"""
|
||||
Главное окно приложения
|
||||
Здесь будет основная функциональность вашего приложения
|
||||
"""
|
||||
print("=" * 50)
|
||||
print("ДОБРО ПОЖАЛОВАТЬ В ГЛАВНОЕ ОКНО ПРИЛОЖЕНИЯ")
|
||||
print("=" * 50)
|
||||
print("\nЗдесь будет основной функционал приложения")
|
||||
print("Это окно открывается после успешной авторизации\n")
|
||||
|
||||
# Здесь можно добавить основную логику приложения
|
||||
# Например, меню, функции работы с данными и т.д.
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main_window()
|
||||
|
||||
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Flask==3.0.0
|
||||
Flask-CORS==4.0.0
|
||||
bcrypt==4.1.2
|
||||
|
||||
Reference in New Issue
Block a user