Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Получение токена в контексте автоматизации тестирования
В автоматизации тестирования получение токена (обычно 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 и требований безопасности. Главное — сделать процесс получения токена надежным, повторно используемым и безопасным в рамках тестового фреймворка.