Credentials
Credentials — это виртуальный аутентификатор WebAuthn, действующий в пределах BrowserContext. Он позволяет тестам регистрировать ключи доступа (passkey) и обрабатывать процедуры navigator.credentials.create() / navigator.credentials.get() на странице без настоящего аутентификатора или аппаратного ключа безопасности.
Существует три распространённых способа его использования:
Использование: добавление заранее известных учётных данных
var context = await browser.NewContextAsync();
// Ключ доступа, который ваш бэкенд уже подготовил для тестового пользователя.
await context.Credentials.CreateAsync("example.com", new()
{
Id = knownCredentialId, // base64url
UserHandle = knownUserHandle, // base64url
PrivateKey = knownPrivateKey, // base64url PKCS#8 (DER)
PublicKey = knownPublicKey, // base64url SPKI (DER)
});
await context.Credentials.InstallAsync();
var page = await context.NewPageAsync();
await page.GotoAsync("https://example.com/login");
// Вызов navigator.credentials.get() на странице обрабатывается с использованием добавленного ключа доступа.
Использование: получение учётных данных с последующим повторным использованием
// Подготовительный тест: дайте приложению зарегистрировать ключ доступа, затем сохраните его.
var context = await browser.NewContextAsync();
await context.Credentials.InstallAsync();
var page = await context.NewPageAsync();
await page.GotoAsync("https://example.com/register");
await page.GetByRole(AriaRole.Button, new() { Name = "Create a passkey" }).ClickAsync();
// Получите ключ доступа, зарегистрированный страницей, — он включает закрытый ключ.
var credentials = await context.Credentials.GetAsync(new() { RpId = "example.com" });
File.WriteAllText("playwright/.auth/passkey.json", JsonSerializer.Serialize(credentials[0]));
// Последующий тест: добавьте сохранённый ключ доступа, чтобы при запуске приложения он уже был зарегистрирован.
var credential = JsonSerializer.Deserialize<VirtualCredential>(
File.ReadAllText("playwright/.auth/passkey.json"));
var context = await browser.NewContextAsync();
await context.Credentials.CreateAsync(credential.RpId, new()
{
Id = credential.Id,
UserHandle = credential.UserHandle,
PrivateKey = credential.PrivateKey,
PublicKey = credential.PublicKey,
SignCount = credential.SignCount,
});
await context.Credentials.InstallAsync();
var page = await context.NewPageAsync();
await page.GotoAsync("https://example.com/login");
// navigator.credentials.get() возвращает сохранённый ключ доступа — вход выполнен.
Использование: сохранение учётных данных в состоянии хранилища с последующим восстановлением
Примеры сохранения и восстановления состояния хранилища приведены в руководстве по аутентификации.
Значения по умолчанию
Методы
CreateAsync
Добавлено в: v1.61Добавляет виртуальные учётные данные WebAuthn и возвращает их.
Если указан только rpId, генерирует новую пару ключей ECDSA P-256, идентификатор учётных данных и идентификатор пользователя. Добавленные учётные данные являются обнаруживаемыми (резидентными), поэтому страница может использовать их как в сценариях с вводом имени пользователя перед использованием ключа доступа, так и в сценариях с ключом доступа без ввода имени пользователя. Возвращаемый объект содержит закрытый и открытый ключи, поэтому его можно сохранить на диск и повторно добавить в последующем тесте.
Чтобы импортировать известные учётные данные, передайте вместе все четыре параметра: Id, UserHandle, PrivateKey и PublicKey. Также передайте SignCount, чтобы продолжить отсчёт со значения счётчика подписей, которое доверяющая сторона уже получила ранее.
Вызовите Credentials.InstallAsync() перед переходом на страницу, использующую WebAuthn.
Использование
await Credentials.CreateAsync(rpId, options);
Аргументы
-
Идентификатор доверяющей стороны (обычно эффективный домен сайта).
-
optionsCredentialsCreateOptions?(необязательно)-
Идентификатор учётных данных, закодированный в base64url. Если не указан, генерируется автоматически.
-
PrivateKeystring? (необязательно)#Закрытый ключ в формате PKCS#8 (DER), закодированный в base64url. Если не указан, генерируется автоматически.
-
PublicKeystring? (необязательно)#Открытый ключ в формате SPKI (DER), закодированный в base64url. Если не указан, генерируется автоматически.
-
SignCountint? (необязательно) Добавлено в: v1.64#Начальное значение счётчика подписей. Счётчик увеличивается на единицу при каждом успешном подтверждении аутентификации через
navigator.credentials.get(), поэтому первое подтверждение сообщает значениеsignCount + 1. По умолчанию —0. -
UserHandlestring? (необязательно)#Идентификатор пользователя, закодированный в base64url. Если не указан, генерируется автоматически.
-
Возвращаемое значение
- Create#
-
idstringИдентификатор учётных данных, закодированный в base64url.
-
rpIdstringИдентификатор доверяющей стороны.
-
userHandlestringИдентификатор пользователя, закодированный в base64url.
-
privateKeystringЗакрытый ключ в формате PKCS#8 (DER), закодированный в base64url.
-
publicKeystringОткрытый ключ в формате SPKI (DER), закодированный в base64url.
-
signCountintСчётчик подписей — значение, переданное доверяющей стороне при последнем подтверждении аутентификации.
-
DeleteAsync
Добавлено в: v1.61Удаляет учётные данные из аутентификатора по их идентификатору. Работает с любыми учётными данными, которые сейчас хранятся в аутентификаторе: как добавленными через Credentials.CreateAsync(), так и зарегистрированными самой страницей с помощью вызова navigator.credentials.create().
Использование
await Credentials.DeleteAsync(id);
Аргументы
Возвращаемое значение
GetAsync
Добавлено в: v1.61Возвращает все учётные данные, которые сейчас хранятся в аутентификаторе, с возможностью фильтрации по RpId или Id. Сюда входят как учётные данные, добавленные через Credentials.CreateAsync(), так и учётные данные, зарегистрированные самой страницей с помощью вызова navigator.credentials.create().
Каждый возвращаемый объект учётных данных включает закрытый и открытый ключи, а также текущее значение счётчика подписей. Поэтому ключ доступа, только что зарегистрированный приложением, можно сохранить и повторно добавить в последующем тесте с помощью Credentials.CreateAsync() — см. второй пример в обзоре класса.
Использование
await Credentials.GetAsync(options);
Аргументы
optionsCredentialsGetOptions?(необязательно)
Возвращаемое значение
- IReadOnlyList<Get>#
InstallAsync
Добавлено в: v1.61Устанавливает виртуальный аутентификатор WebAuthn в контекст, переопределяя navigator.credentials.create() и navigator.credentials.get() на всех текущих и будущих страницах. Вызовите этот метод до того, как страница впервые обратится к navigator.credentials.
Обязательный шаг: пока не вызван Credentials.InstallAsync(), перехват не выполняется и страница использует встроенную реализацию WebAuthn платформы (либо сталкивается с её отсутствием). Добавление учётных данных через Credentials.CreateAsync() без установки аутентификатора наполняет его учётными данными, но страница никогда не получит к ним доступ.
Использование
await Credentials.InstallAsync();
Возвращаемое значение