← Назад к вопросам

Приведи пример аутентификации

1.0 Junior🔥 181 комментариев
#Процессы и методологии разработки#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример и реализация аутентификации в веб-приложении

Аутентификация — это процесс проверки подлинности пользователя, обычно путем подтверждения его личности через учетные данные (логин/пароль, токен и т.д.). В отличие от авторизации (определения прав доступа), аутентификация отвечает на вопрос: "Кто вы?".

Базовый пример аутентификации через логин и пароль

Рассмотрим классический сценарий с проверкой логина и пароля в базе данных с последующим созданием сессии.

# Пример на Python с использованием Flask и SQLAlchemy
from flask import Flask, request, session, redirect, url_for
from werkzeug.security import generate_password_hash, check_password_hash
import sqlite3

app = Flask(__name__)
app.secret_key = 'your-secret-key-here'  # Ключ для подписи сессий

# Функция для создания хеша пароля (вызывается при регистрации)
def create_user(username, password):
    hashed_password = generate_password_hash(password, method='pbkdf2:sha256')
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', 
                   (username, hashed_password))
    conn.commit()
    conn.close()

# Маршрут для аутентификации
@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    
    # Поиск пользователя в базе данных
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute('SELECT password FROM users WHERE username = ?', (username,))
    result = cursor.fetchone()
    conn.close()
    
    # Проверка пароля
    if result and check_password_hash(result[0], password):
        session['username'] = username  # Создание сессии
        return redirect(url_for('dashboard'))
    else:
        return 'Неверные учетные данные', 401

# Защищенный маршрут (требует аутентификации)
@app.route('/dashboard')
def dashboard():
    if 'username' not in session:
        return redirect(url_for('login'))
    return f'Добро пожаловать, {session["username"]}!'

# Выход из системы
@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('login'))

Современный пример с использованием JWT-токенов

В современных API часто используется аутентификация через JSON Web Tokens (JWT) — токены, содержащие зашифрованную информацию о пользователе.

// Пример на Node.js с Express и библиотекой jsonwebtoken
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const app = express();
app.use(express.json());

const SECRET_KEY = 'your-super-secret-jwt-key'; // На практике должен быть в переменных окружения
const users = []; // В реальном приложении - база данных

// Регистрация пользователя
app.post('/register', async (req, res) => {
    try {
        const { username, password } = req.body;
        const hashedPassword = await bcrypt.hash(password, 10);
        users.push({ username, password: hashedPassword });
        res.status(201).json({ message: 'Пользователь создан' });
    } catch (error) {
        res.status(500).json({ error: 'Ошибка при регистрации' });
    }
});

// Аутентификация и выдача JWT
app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    
    // Поиск пользователя
    const user = users.find(u => u.username === username);
    if (!user) return res.status(400).json({ error: 'Пользователь не найден' });
    
    // Проверка пароля
    const validPassword = await bcrypt.compare(password, user.password);
    if (!validPassword) return res.status(400).json({ error: 'Неверный пароль' });
    
    // Создание JWT-токена
    const token = jwt.sign(
        { username: user.username }, // Полезная нагрузка (payload)
        SECRET_KEY,
        { expiresIn: '1h' } // Токен действителен 1 час
    );
    
    res.json({ token }); // Отправка токена клиенту
});

// Middleware для проверки JWT
const authenticateToken = (req, res, next) => {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1]; // Формат: Bearer <token>
    
    if (!token) return res.sendStatus(401);
    
    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) return res.sendStatus(403); // Токен невалиден
        req.user = user;
        next();
    });
};

// Защищенный маршрут
app.get('/profile', authenticateToken, (req, res) => {
    res.json({ message: `Доступ разрешен для пользователя: ${req.user.username}` });
});

Ключевые аспекты и лучшие практики

Основные принципы безопасной аутентификации:

  • Хеширование паролей — никогда не храните пароли в открытом виде. Используйте современные алгоритмы (bcrypt, Argon2, PBKDF2).
  • HTTPS — всегда передавайте учетные данные по зашифрованному соединению.
  • Защита от брутфорса — внедряйте ограничение попыток входа и капчу.
  • Срок действия токенов — устанавливайте разумные сроки жизни сессий и JWT.
  • Безопасное хранение секретов — ключи для подписи JWT и секреты сессий должны храниться в переменных окружения, а не в коде.

Типы аутентификации, которые следует знать QA-инженеру:

  • Базовая (Basic Auth) — логин/пароль в заголовке HTTP (кодируются в Base64).
  • Сессии и куки — состояние хранится на сервере, идентификатор сессии передается в cookie.
  • Токены (JWT, OAuth) — без состояния, токен содержит всю необходимую информацию.
  • Многофакторная (2FA/MFA) — требует дополнительного подтверждения (SMS, приложение).
  • Биометрическая — отпечатки пальцев, распознавание лица.

Что проверять при тестировании аутентификации

Сценарии тестирования для QA:

  • Проверка валидных и невалидных учетных данных.
  • Обработка пустых полей и SQL-инъекций.
  • Истечение срока действия сессий и токенов.
  • Защита маршрутов без аутентификации (должен возвращаться код 401/403).
  • Поведение при множественных неудачных попытках входа.
  • Корректный выход из системы (уничтожение сессии/токена).
  • Межсайтовая подделка запроса (CSRF) для сессионной аутентификации.

Понимание этих принципов и умение протестировать различные механизмы аутентификации — критически важный навык для QA-инженера, работающего с веб-приложениями и API.

Приведи пример аутентификации | PrepBro