Работа с токенами и JWT

Введение в работу с токенами и JWT

Web-тестирование часто требует работы с аутентификацией, что в свою очередь предполагает использование токенов для обеспечения доступа к защищённым ресурсам. Одним из самых популярных форматов для передачи токенов в современных веб-приложениях является JSON Web Token (JWT). Работа с такими токенами в Playwright может быть необходима для имитации аутентифицированных пользователей и выполнения тестов, которые требуют доступа к приватным данным или специфическим функциям.

Основные понятия JWT

JWT представляет собой компактный и безопасный способ передачи информации между сторонами как JSON-объект. Обычно JWT состоит из трёх частей:

  1. Header (Заголовок): указывает тип токена (обычно “JWT”) и алгоритм подписи (например, HMAC SHA256 или RSA).
  2. Payload (Полезная нагрузка): содержит утверждения (claims), которые могут быть данными о пользователе, сроках действия токена и других параметрах.
  3. Signature (Подпись): используется для проверки целостности данных и аутентичности отправителя токена. Подпись создаётся с использованием секретного ключа или приватного ключа в случае асимметричной подписи.

Важной частью является то, что токен не шифруется, и его можно декодировать, но проверка его подлинности требует наличия секретного ключа.

Использование JWT для аутентификации

Большинство современных веб-приложений используют JWT для аутентификации. В этом случае токен передаётся через заголовок HTTP (например, Authorization: Bearer <token>) и используется сервером для проверки, что запрос поступает от аутентифицированного пользователя.

Для автоматизации тестирования с использованием Playwright, важно иметь возможность работать с токенами для имитации аутентифицированных пользователей. Обычно это может быть полезно при тестировании защищённых API или для обхода шагов авторизации в UI-тестах.

Получение и хранение токенов

В случае, если для доступа к защищённому ресурсу необходимо пройти процедуру авторизации, Playwright предоставляет возможность получить JWT токен через выполнение запросов с помощью page.request или автоматизировать процесс входа через UI.

Получение токена с использованием HTTP запросов

Когда авторизация через форму (например, логин и пароль) на сайте является стандартной, можно использовать Playwright для отправки запросов на сервер и получения JWT.

Пример кода для получения токена через HTTP запрос:

import { test, expect } from '@playwright/test';

test('Получение токена с помощью API', async ({ request }) => {
  const response = await request.post('https://your-api.com/login', {
    data: {
      username: 'user',
      password: 'password'
    }
  });

  const responseBody = await response.json();
  const token = responseBody.token; // Токен будет в ответе от сервера
  expect(token).toBeDefined(); // Проверка, что токен получен
});

В этом примере Playwright делает POST запрос к API авторизации, отправляя данные пользователя. Ответ содержит JWT токен, который можно использовать для последующих запросов.

Получение токена через UI

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

import { test, expect } from '@playwright/test';

test('Авторизация через UI', async ({ page }) => {
  await page.goto('https://your-website.com/login');

  await page.fill('input[name="username"]', 'user');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');

  // Допустим, токен сохраняется в localStorage после успешного входа
  const token = await page.evaluate(() => localStorage.getItem('jwt_token'));
  
  expect(token).toBeDefined(); // Проверка, что токен сохранён
});

В данном случае, тест эмулирует действия пользователя в браузере: заполнение формы и отправка данных. После успешного входа токен сохраняется в localStorage, который можно затем извлечь для дальнейших запросов.

Использование токена в запросах

После получения JWT токена можно использовать его для аутентифицированных запросов к API. Для этого добавляется заголовок Authorization с токеном.

Пример использования токена для запроса к API:

import { test, expect } from '@playwright/test';

test('Доступ к защищённому API с токеном', async ({ request }) => {
  const token = 'your_jwt_token';

  const response = await request.get('https://your-api.com/protected-resource', {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });

  expect(response.status()).toBe(200); // Ожидаем успешный ответ от API
});

В этом примере выполняется запрос к защищённому ресурсу, передавая JWT токен в заголовке Authorization. Это позволяет серверу проверить аутентификацию и вернуть нужные данные.

Работа с куки и локальным хранилищем

JWT также могут быть сохранены в куки или в локальном хранилище браузера для последующего использования. В Playwright можно работать с этими данными, имитируя поведение реального пользователя.

Использование куки для хранения токена

import { test, expect } from '@playwright/test';

test('Сохранение токена в куки', async ({ page }) => {
  await page.goto('https://your-website.com/login');

  await page.fill('input[name="username"]', 'user');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');

  // Сохраняем токен в куки
  const cookies = await page.context().cookies();
  const jwtCookie = cookies.find(cookie => cookie.name === 'jwt_token');
  expect(jwtCookie).toBeDefined();
});

Использование локального хранилища для сохранения токена

import { test, expect } from '@playwright/test';

test('Сохранение токена в localStorage', async ({ page }) => {
  await page.goto('https://your-website.com/login');

  await page.fill('input[name="username"]', 'user');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');

  // Извлекаем токен из localStorage
  const token = await page.evaluate(() => localStorage.getItem('jwt_token'));
  expect(token).toBeDefined();
});

Обновление и удаление токенов

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

Обновление токена через API

import { test, expect } from '@playwright/test';

test('Обновление токена', async ({ request }) => {
  const refreshToken = 'your_refresh_token';
  
  const response = await request.post('https://your-api.com/refresh', {
    data: { refresh_token: refreshToken }
  });

  const responseBody = await response.json();
  const newToken = responseBody.token;
  expect(newToken).toBeDefined();
});

Заключение

Работа с токенами и JWT в Playwright позволяет эффективно тестировать сценарии аутентификации и авторизации, а также взаимодействовать с защищёнными API. Использование токенов даёт гибкость при автоматизации тестирования, позволяя имитировать реальные пользовательские действия без необходимости повторной авторизации.