Python для аутентификации: практическая схема клиент-серверного входа

Python для аутентификации: практическая схема клиент-серверного входа

Любой онлайн-сервис держится на трёх шагах: регистрация создаёт учётную запись, аутентификация сверяет данные при входе, авторизация открывает доступ к покупкам и личному кабинету.

Введение

Для начала ставим Python и заводим рабочую папку проекта. Подключаем библиотеки, которые помогут в работе. Дальше набрасываем схему этапов в виде UML-диаграммы — чтобы сразу было видно, кто за что отвечает. Потом пишем сервер с REST API и добавляем клиентскую часть, которая будет обращаться к нему.

Чтобы проверить работу такой системы в условиях, близких к реальным, удобно развернуть её на VPS. Виртуальный сервер позволяет протестировать регистрацию и авторизацию сразу с разных устройств, организовать доступ извне и убедиться, что приложение корректно обрабатывает запросы пользователей, как это будет в продакшене.

Аренда VPS/VDS — от ₽219/месяц

Почему выбирают VPS от AdminVPS:

✓ Дешевле физического сервера

✓ Более гибкий и мощный, чем обычный хостинг

✓ Бесплатная защита от DDoS и техподдержка 24/7

✓ Масштабируется под любые задачи

Виртуальный сервер VPS/VDS — ваш личный сервер для сайтов, магазинов, ботов и других проектов.

popup12

Установка 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 сервер проверяет:

  1. Есть ли токен.
  2. Привязан ли он к пользователю.
  3. Какую роль имеет пользователь.

Если всё корректно, заказ принимается.

Теперь у нас есть:

  • сервер, работающий на Python с Flask;
  • возможность регистрации нового пользователя;
  • опция входа в систему с проверкой пароля;
  • механизм авторизации по токену, который проверяет права пользователя при обращении к ресурсу;
  • полная последовательность действий, отражённая в UML-sequence.

Эта система базовая, но полностью рабочая для тестирования и дальнейшего расширения.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Нужен VPS сервер?

Арендуйте мощный VPS сервер для ваших проектов! Быстрая настройка, высокая производительность и надежная поддержка 24/7. Начните прямо сейчас!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях