#javascript #webauthn
#javascript #webauthn
Вопрос:
Я пытаюсь настроить поток аутентификации WebAuthn на своем веб-сайте, но я сталкиваюсь с проблемой. Я хочу, чтобы мои пользователи могли регистрировать свои устройства на главном веб-сайте (www.domain.com ) таким образом, он легко доступен через их пользовательские настройки. Сама аутентификация происходит на другом поддомене через IdP (sso.domain.com ). Вот тут-то и начались проблемы.
Есть пара вещей, которые я пробовал:
- Регистрация и аутентификация на www.scoutswechel.be, передавая ‘www.scoutswechel.be ‘ поскольку rp.id для обоих => работает.
- Регистрация на www.scoutswechel.be аутентификация на sso.scoutswechel.be, передавая ‘www.scoutswechel.be ‘ поскольку rp.id для обоих => этап аутентификации завершается неудачей, поскольку аутентификатор не возвращает никаких ключей.
- Регистрация на www.scoutswechel.be , аутентификация на sso.scoutswechel, передача этих доменов соответственно как rp.id => этап аутентификации завершается неудачей, поскольку аутентификатор не возвращает никаких ключей.
- Регистрация на www.scoutswechel.be аутентификация на sso.scoutswechel.be, передавая ‘scoutswechel.be ‘ как rp.id для обоих => шаг регистрации уже завершается с различными ошибками для разных браузеров (например, «ключ вернул что-то неожиданное (2)» в Chrome).
Если я правильно понимаю спецификацию, передача ‘scoutswechel.be ‘на самом деле должен работать, поскольку оба домена являются поддоменами основного домена (поправьте меня, если я здесь ошибаюсь).
Я готовлю свои задачи с помощью PHP и передаю их на страницу с помощью вызовов ajax. Мои PHP-скрипты возвращают, например, следующее значение:
{
"publicKey":{
"challenge":[105,107,101,103,105,49,119,115,98,108,119,109,48,109,105,53],
"user":{
"name":"walter",
"displayName":"Wouter Henderickx",
"id":[49,48,51]
},
"rp":{
"id":"scoutswechel.be",
"name":"scoutswechel.be"
},
"pubKeyCredParams":[
{
"alg":-7,
"type":"public-key"
}
],
"authenticatorSelection":{
"authenticatorAttachment":"cross-platform",
"requireResidentKey":false,
"userVerification":"preferred"
},
"attestation":null,
"timeout":60000,
"excludeCredentials":[],
"extensions":{
"exts":true
}
},
"b64challenge":"aWtlZ2kxd3NibHdtMG1pNQ"
}
Затем я преобразую вызов и user.id в Uint8Array и передать часть publickey в:
navigator.credentials.create({publicKey: key.publicKey}).
then(function (aNewCredentialInfo) {
do.stuff()
})
Как мне следует поступить по этому поводу? Какие значения я могу передать в rp.id чтобы это работало на обоих поддоменах?
Комментарии:
1. Да, scoutswechel.be должен быть RP ID, который вам нужно выбрать, чтобы область учетных данных, которые вы создаете во время регистрации, также могла использоваться во время аутентификации.
2. Я перечитал спецификацию, и вы действительно правы: если я зарегистрирую свои учетные данные с scoutswechel.be как идентификатор RP, он может использоваться на всех своих поддоменах. Проблема в том, что я хочу выполнить регистрацию на www.scoutswechel.be и регистрация завершится неудачно, потому что идентификатор RP должен быть равен домену в браузере или быть поддоменом того, что есть в браузере. Обходной путь, который я сейчас попробую, — это выполнить фактическую регистрацию на sso.scoutswechel.be также (с помощью simplesaml). Я буду обновлять этот вопрос своими отзывами.
3. Идентификатор RP не обязательно должен быть равен домену. Его можно переопределить как суффикс регистрируемого домена, что вам и нужно сделать в вашем случае. Ссылка: w3.org/TR/webauthn/#relying-party-identifier .
4. Это имеет смысл с точки зрения чистой спецификации, но моя реализация все еще не работает. Вы можете проверить это, если хотите на scoutswechel.be/webauthn/register . Консоль зарегистрирует передаваемый мной вызов и ошибку, которую вы получите от функции credentials.create.
Ответ №1:
В конце концов, я разобрался с этим. Все это были проблемы с реализацией с моей стороны:
- В библиотеке я основал свой проект на (https://github.com/davidearl/webauthn ), был фрагмент javascript, который сравнивал значение rp.name к источнику. Поскольку я передавал имя, не относящееся к домену, эта проверка блокировала дальнейшее выполнение.
- Я передавал ‘rpid’ для идентификатора проверяющей стороны. Однако это должно было быть ‘rpId’. Поскольку мой аутентификатор не смог найти никаких учетных данных без rpid, он ничего не вернул, и я не был аутентифицирован.