WebAuthn на нескольких поддоменах

#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, он ничего не вернул, и я не был аутентифицирован.