Credentials
Credentials — это виртуальный аутентификатор WebAuthn, действующий в пределах BrowserContext. Он позволяет тестам регистрировать ключи доступа (passkey) и обрабатывать процедуры navigator.credentials.create() / navigator.credentials.get() на странице без настоящего аутентификатора или аппаратного ключа безопасности.
Существует три распространённых способа его использования:
Использование: добавление заранее известных учётных данных
- Sync
- Async
context = browser.new_context()
# Ключ доступа, который ваш бэкенд уже подготовил для тестового пользователя.
context.credentials.create(
"example.com",
id=known_credential_id, # base64url
user_handle=known_user_handle, # base64url
private_key=known_private_key, # base64url PKCS#8 (DER)
public_key=known_public_key, # base64url SPKI (DER)
)
context.credentials.install()
page = context.new_page()
page.goto("https://example.com/login")
# Вызов navigator.credentials.get() на странице получает добавленный ключ доступа.
context = await browser.new_context()
# Ключ доступа, который ваш бэкенд уже подготовил для тестового пользователя.
await context.credentials.create(
"example.com",
id=known_credential_id, # base64url
user_handle=known_user_handle, # base64url
private_key=known_private_key, # base64url PKCS#8 (DER)
public_key=known_public_key, # base64url SPKI (DER)
)
await context.credentials.install()
page = await context.new_page()
await page.goto("https://example.com/login")
# Вызов navigator.credentials.get() на странице получает добавленный ключ доступа.
Использование: получение учётных данных для последующего повторного использования
- Sync
- Async
# Подготовительный тест: позволяем приложению зарегистрировать ключ доступа, затем сохраняем его.
context = browser.new_context()
context.credentials.install()
page = context.new_page()
page.goto("https://example.com/register")
page.get_by_role("button", name="Create a passkey").click()
# Получаем зарегистрированный страницей ключ доступа — он включает закрытый ключ.
[credential] = context.credentials.get(rp_id="example.com")
with open("playwright/.auth/passkey.json", "w") as f:
json.dump(credential, f)
# Подготовительный тест: позволяем приложению зарегистрировать ключ доступа, затем сохраняем его.
context = await browser.new_context()
await context.credentials.install()
page = await context.new_page()
await page.goto("https://example.com/register")
await page.get_by_role("button", name="Create a passkey").click()
# Получаем зарегистрированный страницей ключ доступа — он включает закрытый ключ.
[credential] = await context.credentials.get(rp_id="example.com")
with open("playwright/.auth/passkey.json", "w") as f:
json.dump(credential, f)
- Sync
- Async
# Последующий тест: добавляем сохранённый ключ доступа, чтобы он уже был зарегистрирован при запуске приложения.
with open("playwright/.auth/passkey.json") as f:
credential = json.load(f)
context = browser.new_context()
context.credentials.create(
credential["rpId"],
id=credential["id"],
user_handle=credential["userHandle"],
private_key=credential["privateKey"],
public_key=credential["publicKey"],
sign_count=credential["signCount"],
)
context.credentials.install()
page = context.new_page()
page.goto("https://example.com/login")
# navigator.credentials.get() возвращает сохранённый ключ доступа — вход уже выполнен.
# Последующий тест: добавляем сохранённый ключ доступа, чтобы он уже был зарегистрирован при запуске приложения.
with open("playwright/.auth/passkey.json") as f:
credential = json.load(f)
context = await browser.new_context()
await context.credentials.create(
credential["rpId"],
id=credential["id"],
user_handle=credential["userHandle"],
private_key=credential["privateKey"],
public_key=credential["publicKey"],
sign_count=credential["signCount"],
)
await context.credentials.install()
page = await context.new_page()
await page.goto("https://example.com/login")
# navigator.credentials.get() возвращает сохранённый ключ доступа — вход уже выполнен.
Использование: сохранение учётных данных в состоянии хранилища для последующего восстановления
Примеры сохранения и восстановления состояния хранилища приведены в руководстве по аутентификации.
Значения по умолчанию
Методы
create
Добавлено в: v1.61Добавляет учётные данные в виртуальный аутентификатор WebAuthn и возвращает их.
Если указан только rp_id, генерирует новую пару ключей ECDSA P-256, идентификатор учётных данных и идентификатор пользователя. Добавленные учётные данные являются обнаруживаемыми (резидентными), поэтому страница может получить их как в сценарии ввода имени пользователя с последующим использованием ключа доступа, так и в сценарии использования ключа доступа без имени пользователя. Возвращаемый объект содержит закрытый и открытый ключи, поэтому его можно сохранить на диск и повторно добавить в последующем тесте.
Чтобы импортировать известные учётные данные, передайте все четыре параметра — id, user_handle, private_key и public_key — одновременно. Также передайте sign_count, чтобы продолжить отсчёт со значения счётчика подписей, которое доверяющая сторона уже получила.
Вызовите credentials.install() перед переходом на страницу, использующую WebAuthn.
Использование
credentials.create(rp_id)
credentials.create(rp_id, **kwargs)
Аргументы
-
Идентификатор доверяющей стороны (обычно действующий домен сайта).
-
Идентификатор учётных данных в кодировке base64url. Генерируется автоматически, если не указан.
-
private_keystr (необязательно)#Закрытый ключ PKCS#8 (DER) в кодировке base64url. Генерируется автоматически, если не указан.
-
public_keystr (необязательно)#Открытый ключ SPKI (DER) в кодировке base64url. Генерируется автоматически, если не указан.
-
sign_countint (необязательно) Добавлено в: v1.64#Начальное значение счётчика подписей. Счётчик увеличивается на единицу при каждом успешном подтверждении аутентификации через
navigator.credentials.get(), поэтому первое подтверждение сообщает значениеsignCount + 1. По умолчанию —0. -
user_handlestr (необязательно)#Идентификатор пользователя в кодировке base64url. Генерируется автоматически, если не указан.
Возвращаемое значение
- Dict#
-
idstrИдентификатор учётных данных в кодировке base64url.
-
rpIdstrИдентификатор доверяющей стороны.
-
userHandlestrИдентификатор пользователя в кодировке base64url.
-
privateKeystrЗакрытый ключ PKCS#8 (DER) в кодировке base64url.
-
publicKeystrОткрытый ключ SPKI (DER) в кодировке base64url.
-
signCountintСчётчик подписей: значение, переданное доверяющей стороне в последнем подтверждении аутентификации.
-
delete
Добавлено в: v1.61Удаляет учётные данные из аутентификатора по их идентификатору. Работает с любыми учётными данными, которые в данный момент хранятся в аутентификаторе: как с добавленными через credentials.create(), так и с зарегистрированными самой страницей посредством вызова navigator.credentials.create().
Использование
credentials.delete(id)
Аргументы
Возвращаемое значение
get
Добавлено в: v1.61Возвращает все учётные данные, которые в данный момент хранятся в аутентификаторе, с возможностью фильтрации по rp_id или id. В их число входят как учётные данные, добавленные через credentials.create(), так и учётные данные, зарегистрированные самой страницей посредством вызова navigator.credentials.create().
Каждый возвращаемый набор учётных данных включает закрытый и открытый ключи, а также текущее значение счётчика подписей. Поэтому ключ доступа, только что зарегистрированный приложением, можно сохранить и повторно добавить в последующем тесте с помощью credentials.create() — см. второй пример в обзоре класса.
Использование
credentials.get()
credentials.get(**kwargs)
Аргументы
-
Возвращать только учётные данные с этим идентификатором в кодировке base64url.
-
Возвращать только учётные данные для этого идентификатора доверяющей стороны.
Возвращаемое значение
install
Добавлено в: v1.61Устанавливает виртуальный аутентификатор WebAuthn в контекст, переопределяя navigator.credentials.create() и navigator.credentials.get() на всех существующих и будущих страницах. Вызовите этот метод до первого обращения страницы к navigator.credentials.
Обязательный шаг: до вызова credentials.install() перехват не выполняется, и страница использует встроенную реализацию WebAuthn платформы (либо сталкивается с её отсутствием). Добавление учётных данных через credentials.create() без установки аутентификатора заполняет его данными, но страница никогда не увидит эти учётные данные.
Использование
credentials.install()
Возвращаемое значение