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

Какой знаешь пример Authentication?

1.0 Junior🔥 243 комментариев
#Веб-тестирование#Теория тестирования#Тестирование API

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

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

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

Практические примеры Authentication (Аутентификации)

В разработке authentication (аутентификация) — это процесс проверки подлинности пользователя или системы, подтверждающий, что они действительно являются теми, за кого себя выдают. В отличие от authorization (авторизации), которая определяет права доступа, аутентификация отвечает на вопрос: «Кто ты?». Я приведу примеры из разных слоёв современных приложений, от базовых до продвинутых.

1. Базовая аутентификация (HTTP Basic Auth)

Это простейший метод, при котором логин и пароль передаются в заголовке каждого HTTP-запроса в кодировке Base64. Не рекомендуется для production без HTTPS из-за низкой безопасности.

GET /api/data HTTP/1.1
Host: example.com
Authorization: Basic dXNlcjpwYXNzd29yZA==

Здесь dXNlcjpwYXNzd29yZA== — это Base64-кодированная строка user:password. Сервер декодирует её и проверяет учётные данные.

2. Аутентификация с использованием сессий (Session-based)

Классический подход для веб-приложений. Пользователь входит с логином/паролем, сервер создаёт уникальный идентификатор сессии, хранит его на сервере и отправляет клиенту в cookie.

# Пример на Flask (Python)
from flask import Flask, session, request, jsonify
import secrets

app = Flask(__name__)
app.secret_key = secrets.token_hex(32)

@app.route('/login', methods=['POST'])
def login():
    data = request.json
    if data['username'] == 'admin' and data['password'] == 'secret':
        session['user_id'] = 'admin'  # Сохраняем в сессии
        return jsonify({'status': 'authenticated'})
    return jsonify({'error': 'Invalid credentials'}), 401

@app.route('/profile')
def profile():
    if 'user_id' not in session:  # Проверяем аутентификацию
        return jsonify({'error': 'Unauthorized'}), 401
    return jsonify({'user': session['user_id']})

Недостатки: Состояние хранится на сервере, что усложняет масштабирование.

3. Токен-базированная аутентификация (например, JWT)

Современный stateless-подход. Сервер выдаёт подписанный токен после успешного входа, клиент отправляет его в заголовке Authorization: Bearer <token>. Сервер проверяет подпись, не храня состояние.

// Пример генерации/верификации JWT в Node.js
const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';

// Генерация токена при логине
const token = jwt.sign(
  { userId: '12345', role: 'user' }, // payload (данные)
  secret,
  { expiresIn: '1h' } // срок действия
);
console.log('Token:', token);

// Верификация в middleware
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (!token) return res.sendStatus(401);
  
  jwt.verify(token, secret, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user; // user = { userId: '12345', role: 'user' }
    next();
  });
}

Преимущества: Масштабируемость, возможность использования в микросервисах и мобильных приложениях.

4. OAuth 2.0 и OpenID Connect

Используются для делегированного доступа и аутентификации через сторонних провайдеров (Google, GitHub и т.д.). Пользователь перенаправляется к провайдеру, который после успешного входа возвращает access token.

Пример потока OAuth 2.0 Authorization Code:
1. Приложение → Пользователь: Перенаправление на /auth?client_id=ID&redirect_uri=URI
2. Пользователь → Провайдер: Ввод логина/пароля
3. Провайдер → Приложение: Код авторизации на redirect_uri
4. Приложение → Провайдер: Обмен кода на access token
5. Приложение → API: Запросы с access token в заголовке

OpenID Connect (OIDC) расширяет OAuth 2.0, добавляя стандартизированный способ получения информации о пользователе (ID token в формате JWT).

5. Биометрическая аутентификация

Используется в мобильных приложениях и современных ОС. Пример — разблокировка по отпечатку пальца (Touch ID) или лицу (Face ID). На уровне API это часто реализуется через локальную аутентификацию на устройстве с последующей выдачей токена.

// Пример использования Face ID в iOS
import LocalAuthentication

let context = LAContext()
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, 
                       localizedReason: "Unlock access") { success, error in
    if success {
        // Биометрия успешна, выполняем логин в приложении
        self.sendTokenToServer()
    }
}

6. Многофакторная аутентификация (MFA)

Сочетает несколько методов, например:

  • Что-то знаешь (пароль)
  • Что-то имеешь (TOTP-токен из приложения Google Authenticator)
  • Что-то есть (отпечаток пальца)

Пример кода генерации TOTP:

import pyotp

# Сервер создаёт секрет для пользователя
secret = pyotp.random_base32()
# Пользователь добавляет секрет в приложение-аутентификатор

# Проверка кода, введённого пользователем
totp = pyotp.TOTP(secret)
if totp.verify('123456'):  # Код из приложения
    print("Аутентификация успешна")

Вывод для QA-инженера

При тестировании аутентификации необходимо проверять:

  • Безопасность передачи (HTTPS, отсутствие данных в логах)
  • Валидацию токенов (истечение срока, подпись)
  • Обработку ошибок (неверные учётные данные, просроченные сессии)
  • Защиту от атак (брутфорс, replay-атаки, инъекции)
  • Соответствие стандартам (OAuth flows, JWT claims)

Понимание этих примеров позволяет эффективно тестировать сценарии входа, восстановления пароля и безопасности endpoints в API и UI.