Аутентификация API

Puppeteer предоставляет возможность эмулировать поведение браузера, включая работу с API и заголовками запросов. Для тестирования защищённых ресурсов часто требуется выполнять аутентификацию через API, например, используя токены Bearer или Basic Auth.

Передача заголовков аутентификации

Самый простой способ аутентификации — установка заголовков запроса. В Puppeteer это реализуется через метод page.setExtraHTTPHeaders():

await page.setExtraHTTPHeaders({
  &
  'Content-Type': 'application/json'
});

Здесь ключевым моментом является правильное указание токена и формата заголовка. Для Basic Auth заголовок формируется как Basic base64(username:password).

Аутентификация через формы

Если API интегрирован с веб-интерфейсом и требует входа через форму, Puppeteer позволяет эмулировать ввод данных и отправку формы:

await page.goto('https://example.com/login');
await page.type('#username', 'user123');
await page.type('#password', 'securePassword');
await page.click('#login-button');
await page.waitForNavigation({ waitUntil: 'networkidle0' });

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

Работа с куки и сессиями

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

// Сохранение куки после входа
const cookies = await page.cookies();
require('fs').writeFileSync('cookies.json', JSON.stringify(cookies, null, 2));

// Загрузка куки в новую сессию
const cookies = JSON.parse(require('fs').readFileSync('cookies.json'));
await page.setCookie(...cookies);

Это особенно полезно для долгосрочного тестирования API с ограниченными ресурсами аутентификации.

Использование API-запросов напрямую

Для сложных сценариев тестирования можно отправлять HTTP-запросы напрямую из Puppeteer с помощью встроенного fetch внутри контекста страницы:

const response = await page.evaluate(async () => {
  const res = await fetch('https://example.com/api/data', {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json'
    }
  });
  return res.json();
});
console.log(response);

Этот подход позволяет проверять результаты API без необходимости рендеринга интерфейса, сохраняя полный контроль над заголовками и телом запроса.

Обработка токенов обновления (refresh tokens)

Для API с коротким сроком действия токенов важно реализовать механизм обновления. Puppeteer может имитировать отправку запроса на /refresh и автоматическое обновление токена в заголовках:

async function refreshToken(page) {
  const newToken = await page.evaluate(async () => {
    const res = await fetch('https://example.com/api/refresh', {
      method: 'POST',
      credentials: 'include'
    });
    const data = await res.json();
    return data.accessToken;
  });
  await page.setExtraHTTPHeaders({ 'Authorization': `Bearer ${newToken}` });
}

Логирование и отладка запросов

Для отслеживания аутентификации полезно использовать перехват сетевых запросов:

await page.setRequestInterception(true);
page.on('request', request => {
  console.log('Request URL:', request.url());
  console.log('Request Headers:', request.headers());
  request.continue();
});

Это позволяет проверять, что токены и куки корректно отправляются с каждым запросом к API.

Защита данных и безопасное хранение токенов

Все токены и пароли необходимо хранить в защищённых переменных окружения и никогда не включать напрямую в код. Использование .env файлов и библиотек вроде dotenv обеспечивает безопасное управление секретами:

require('dotenv').config();
await page.setExtraHTTPHeaders({
  'Authorization': `Bearer ${process.env.API_TOKEN}`
});

Обработка ошибок аутентификации

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

const response = await page.goto('https://example.com/protected');
if (response.status() === 401) {
  console.error('Аутентификация не удалась');
  await refreshToken(page);
}

Такой подход обеспечивает надёжность тестов и минимизирует зависимость от внешних факторов.

Интеграция с CI/CD

В автоматизированных пайплайнах Puppeteer может использоваться для тестирования защищённых API без интерактивного браузера, запускаясь в headless режиме. Установка заголовков, куки и токенов позволяет интегрировать проверку аутентификации напрямую в процесс сборки и тестирования.