Любой онлайн-сервис держится на трёх шагах: регистрация создаёт учётную запись, аутентификация сверяет данные при входе, авторизация открывает доступ к покупкам и личному кабинету.
Введение
Для начала ставим Python и заводим рабочую папку проекта. Подключаем библиотеки, которые помогут в работе. Дальше набрасываем схему этапов в виде UML-диаграммы — чтобы сразу было видно, кто за что отвечает. Потом пишем сервер с REST API и добавляем клиентскую часть, которая будет обращаться к нему.
Чтобы проверить работу такой системы в условиях, близких к реальным, удобно развернуть её на VPS. Виртуальный сервер позволяет протестировать регистрацию и авторизацию сразу с разных устройств, организовать доступ извне и убедиться, что приложение корректно обрабатывает запросы пользователей, как это будет в продакшене.
Установка Python
На главной странице сайта python.org найдите опцию «Download Python …» с номером последней версии и скачайте файл установки. Обязательно поставьте галочку Add Python to PATH для запуска Python в командной строке.
Нажмите Install Now.
После завершения нажмите Close.
Для проверки используйте сочетание Win + R, затем введите cmd и подтвердите клавишей Enter.
В терминале наберите:
python --version
Появится уведомление о версии Python, например Python 3.12.2.
Создание рабочей папки проекта
Откройте любую папку на компьютере.
Щёлкните правой кнопкой мыши → Создать → Папку.
Назовите её, например, auth_project.
Правой кнопкой внутри каталога выберите «Открыть».
Убедитесь, что путь соответствует вашей папке:
cd путь_к_папке\auth_project
Создание виртуальной среды
Это отдельная «коробка» для библиотек, где обеспечивается автономность проекта от других программ.
Набираем в командной строке:
python -m venv venv
После этого появится подпапка venv.
Активация окружения на Windows:
venv\Scripts\activate
На Linux / macOS:
source venv/bin/activate
Появление в начале строки терминала (venv) означает, что окружение включено.
Установка библиотек
Когда Python уже стоит и создан каталог проекта, добавляем необходимые модули для запуска сервера:
- Flask — простой и удобный вариант для запуска веб-ресурса;
- Werkzeug — это набор инструментов для WSGI-приложений. В нашем примере используется модуль werkzeug.security для хеширования и проверки паролей.
Чтобы установить их, откройте консоль и введите:
pip install flask
pip install werkzeug
Создание минимального сервера
Подготовим самый его простой вариант, который будет запускаться прямо на компьютере.
В директории проекта auth_project создайте новый файл. Для этого в Windows щёлкните правой кнопкой мыши в папке → выберите Создать → Текстовый документ.
В Linux или macOS можно воспользоваться командой в консоли:
touch server.py
Назовите документ server.py. Если он создавался как «Новый текстовый документ.txt», уберите расширение .txt и замените его на .py.
Откройте его в любом редакторе (например, Notepad++, VS Code или даже стандартный Блокнот) и вставьте туда следующий код:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Сервер работает!"
if __name__ == "__main__":
app.run(debug=True)
Сохраните.
Теперь включите сервер в папке проекта:
python server.py
Для проверки функциональности откройте браузер и в адресной строке введите:
http://127.0.0.1:5000/
Должно появиться сообщение:
Сервер работает!
Проектирование логики в виде последовательности действий (UML-sequence)
Обычно взаимодействие клиента и сервера изображают с помощью диаграмм последовательностей (UML-sequence diagrams). Это схемы, где видно, кто и в какой момент выполняет действие: пользователь, сервер, база данных и т. д. Но мы составим «текстовую диаграмму» — список шагов, которые выполняются при регистрации, входе и авторизации.
Регистрация нового пользователя:
- клиент вводит логин и пароль в форму регистрации и нажимает кнопку;
- клиентская программа (например, браузер) отправляет эти данные на сервер. Сервер получает запрос и проверяет, есть ли в базе данных пользователь с таким логином;
- если логин новый, сервер с помощью библиотеки werkzeug превращает пароль в хеш (защищённый вариант, который нельзя прочитать напрямую);
- сервер записывает логин и хеш пароля в базу данных;
- сервер возвращает клиенту ответ: «Регистрация успешна» или «Ошибка» (например, логин уже существует).
Вход (аутентификация):
- клиент вводит логин и пароль в форму входа;
- эти данные отправляются на сервер;
- сервер ищет пользователя по логину в базе данных;
- сервер проверяет пароль: берёт хеш из базы и сравнивает его с введённым паролем через функцию check_password_hash;
- если пароль правильный, сервер создаёт токен сессии (уникальный ключ для текущего входа);
- сервер отправляет клиенту этот токен. С этого момента клиент «узнаётся» сервером.
Авторизация (проверка прав):
- клиент пытается получить доступ к ресурсу (например, сделать заказ или открыть личный кабинет). Вместе с запросом он передаёт токен;
- сервер проверяет токен: действительно ли он записан в базе и не устарел ли;
- сервер проверяет, какую роль имеет пользователь (например, «обычный пользователь» или «администратор»);
- если всё верно, сервер разрешает действие. Если нет — возвращает сообщение об ошибке доступа.
Реализация регистрации и входа в Python
Создание пользователей
В папке проекта создайте users.py и вставьте код:
from werkzeug.security import generate_password_hash, check_password_hash
users_db = {}
def register_user(login, password):
if login in users_db:
return False, "Пользователь уже существует"
hashed_password = generate_password_hash(password)
users_db[login] = {"password": hashed_password, "role": "user"}
return True, "Регистрация успешна"
def authenticate_user(login, password):
user = users_db.get(login)
if not user:
return False, "Пользователь не найден"
if not check_password_hash(user["password"], password):
return False, "Неверный пароль"
return True, "Вход выполнен"
Подключение к серверу
from flask import request, jsonify
from users import users_db, register_user, authenticate_user
Маршрут регистрации
@app.route("/register", methods=["POST"])
def register():
data = request.json or {}
username = data.get("login")
password = data.get("password")
if not username or not password:
return jsonify({"message": "Логин и пароль обязательны"}), 400
success, message = register_user(username, password)
status = 200 if success else 400
return jsonify({"message": message}), status
Маршрут входа
@app.route("/login", methods=["POST"])
def login():
data = request.json or {}
username = data.get("login")
password = data.get("password")
if not username or not password:
return jsonify({"message": "Логин и пароль обязательны"}), 400
success, message = authenticate_user(username, password)
status = 200 if success else 401
# Сохранение токена после успешной аутентификации:
if success:
token = f"token-{username}"
users_db[username]["token"] = token
return jsonify({"message": message, "token": token}), status
return jsonify({"message": message}), status
Проверка работы сервера
Проверка работы сервера. В терминале, где активировано окружение, запустите сервер:
python server.py
Linux / macOS. Регистрация:
curl -X POST http://127.0.0.1:5000/register \
-H "Content-Type: application/json" \
-d '{"login":"ivan","password":"12345"}'
Вход:
curl -X POST http://127.0.0.1:5000/login \
-H "Content-Type: application/json" \
-d '{"login":"ivan","password":"12345"}'
Windows PowerShell. Регистрация:
curl -X POST http://127.0.0.1:5000/register `
-H "Content-Type: application/json" `
-d '{\"login\":\"ivan\",\"password\":\"12345\"}'
Вход:
curl -X POST http://127.0.0.1:5000/login `
-H "Content-Type: application/json" `
-d '{\"login\":\"ivan\",\"password\":\"12345\"}'
Авторизация — проверка прав пользователя
В server.py добавляем маршрут «оформление заказа»:
from flask import request, jsonify
from users import users_db
@app.route("/order", methods=["POST"])
def create_order():
auth = request.headers.get("Authorization", "")
# Поддерживаем формат "Bearer <token>" и просто "<token>"
parts = auth.split()
token = parts[1] if len(parts) == 2 and parts[0].lower() == "bearer" else auth.strip()
if not token:
return jsonify({"error": "Требуется авторизация"}), 401
user = next((u for u in users_db.values() if u.get("token") == token), None)
if user is None:
return jsonify({"error": "Неверный токен"}), 403
if user.get("role") != "user":
return jsonify({"error": "Нет прав для выполнения действия"}), 403
return jsonify({"message": "Заказ принят"}), 200
Для простоты в маршруте входа (/login) добавляем сохранение токена:
token = f"token-{username}"
user = users_db[username]
user["token"] = token
Теперь при обращении к /order с заголовком Authorization сервер проверяет:
- Есть ли токен.
- Привязан ли он к пользователю.
- Какую роль имеет пользователь.
Если всё корректно, заказ принимается.
Теперь у нас есть:
- сервер, работающий на Python с Flask;
- возможность регистрации нового пользователя;
- опция входа в систему с проверкой пароля;
- механизм авторизации по токену, который проверяет права пользователя при обращении к ресурсу;
- полная последовательность действий, отражённая в UML-sequence.
Эта система базовая, но полностью рабочая для тестирования и дальнейшего расширения.
Читайте в блоге:
- Настройка заданий cron и systemd-таймеров для автоматизации рутинных задач на Ubuntu 24.04
- Основы работы с nftables на Ubuntu 24.04
- Как генерировать надёжные пароли на Ubuntu 24.04