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

Как получить токен?

2.2 Middle🔥 191 комментариев
#Теория тестирования

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

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

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

Получение токена в контексте автоматизации тестирования

В автоматизации тестирования получение токена (обычно JWT, OAuth, API-ключа или сессионного токена) — это критически важный этап для аутентификации и авторизации в тестируемых системах. Метод получения зависит от типа токена и архитектуры приложения.

Основные типы токенов и способы их получения

1. JWT (JSON Web Token)

Чаще всего получается через запрос к эндпоинту аутентификации (например, /auth/login), передавая учетные данные.

import requests

def get_jwt_token(base_url, username, password):
    auth_endpoint = f"{base_url}/api/auth/login"
    payload = {
        "username": username,
        "password": password
    }
    response = requests.post(auth_endpoint, json=payload)
    response.raise_for_status()  # Проверка на ошибки HTTP
    token_data = response.json()
    # Предполагаем, что токен возвращается в поле 'access_token'
    return token_data.get('access_token')

# Использование
BASE_URL = "https://api.example.com"
token = get_jwt_token(BASE_URL, "test_user", "Pass123")
print(f"Полученный JWT: {token}")

2. OAuth 2.0 токены (например, для Google, GitHub API)

Используется поток Client Credentials (для machine-to-machine) или Authorization Code (с участием пользователя). Для автоматизации часто используют первый.

import requests

def get_oauth2_token(token_url, client_id, client_secret, scope=""):
    data = {
        'grant_type': 'client_credentials',
        'client_id': client_id,
        'client_secret': client_secret,
        'scope': scope
    }
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    response = requests.post(token_url, data=data, headers=headers)
    response.raise_for_status()
    return response.json().get('access_token')

# Пример для условного API
TOKEN_URL = "https://oauth.example.com/token"
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_secret"
oauth_token = get_oauth2_token(TOKEN_URL, CLIENT_ID, CLIENT_SECRET)

3. API-ключи (API Keys)

Обычно статичны, выдаются администратором системы и передаются в заголовках или параметрах запроса.

API_KEY = "x-api-key-12345abcdef"
headers = {"X-API-Key": API_KEY}
# Далее используем headers в запросах

4. Сессионные токены (Session Tokens)

Часто получаются через веб-форму логина, с последующим извлечением из cookies или HTML.

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def get_session_token_via_ui(login_url, username, password):
    driver = webdriver.Chrome()
    driver.get(login_url)
    
    driver.find_element(By.ID, "username").send_keys(username)
    driver.find_element(By.ID, "password").send_keys(password)
    driver.find_element(By.ID, "submit").click()
    
    time.sleep(2)  # Ждем загрузки, лучше использовать явные ожидания
    # Извлекаем токен из cookies
    session_cookie = driver.get_cookie("sessionid")
    driver.quit()
    return session_cookie['value'] if session_cookie else None

Ключевые практики в автоматизации:

  • Безопасное хранение учетных данных: Никогда не хардкодить секреты в коде. Использовать переменные окружения, .env файлы (с библиотекой python-dotenv) или secret-менеджеры (HashiCorp Vault, AWS Secrets Manager).
  • Изоляция тестовых данных: Использовать выделенные тестовые учетные записи.
  • Обработка истечения срока действия: Реализовать логику рефреша (обновления) токена, если истек.
  • Кэширование токенов: Чтобы не запрашивать токен для каждого теста, кэшировать его на время жизни (TTL).

Пример комплексного решения с кэшированием и обновлением:

import requests
import time
from functools import lru_cache

class AuthManager:
    def __init__(self, base_url, credentials):
        self.base_url = base_url
        self.credentials = credentials
        self._token = None
        self._token_expiry = None

    def _request_new_token(self):
        """Запрос нового токена у сервера."""
        resp = requests.post(f"{self.base_url}/auth", json=self.credentials)
        resp.raise_for_status()
        data = resp.json()
        self._token = data['token']
        # Предположим, токен живет 300 секунд
        self._token_expiry = time.time() + 300
        return self._token

    @property
    def token(self):
        """Свойство, возвращающее валидный токен (запрашивает новый при необходимости)."""
        if self._token is None or time.time() > self._token_expiry:
            return self._request_new_token()
        return self._token

# Использование
auth = AuthManager("https://api.test.com", {"user": "test", "pass": "test"})
headers = {"Authorization": f"Bearer {auth.token}"}
response = requests.get("https://api.test.com/data", headers=headers)

Рекомендации для тестов:

  • Мокать аутентификацию в юнит-тестах, чтобы не зависеть от внешнего сервиса.
  • В интеграционных и e2e-тестах использовать реальное получение токена, но с тестовым аккаунтом.
  • Всегда валидировать ответ эндпоинта аутентификации на наличие ожидаемых полей.

Выбор метода зависит от тестируемого API и требований безопасности. Главное — сделать процесс получения токена надежным, повторно используемым и безопасным в рамках тестового фреймворка.