WebAuthn: вход в поддомен невозможен

У меня есть проект Angular 11 (Frontend) и Kotlin (Backend), в котором я реализовал вход через WebAuthn.

Регистрация работает просто, я получаю вызов от (WebAuthn4J) Backend и создаю учетные данные с помощью этого:

...

const credentialOptions: CredentialCreationOptions = {
   publicKey: {
     attestation: 'direct',
     user: {
       name: 'UsernameXYZ',
       displayName: 'UsernameXYZ',
       id: decodeUrlSafeB64(btoa('<uuid-from-db>'))
     },
     rp: {
       id: 'my-company.com',
       name: 'My Company'
     },
     challenge: challenge, // Challenge from Backend as B64
     pubKeyCredParams: [
       {
         type: 'public-key',
         alg: -257 // RS256
       },
       {
         type: 'public-key',
         alg: -7 // ES256
       }
     ],
     authenticatorSelection: undefined // All options possible
   }
 };
 const credentials: Credential = await navigator.credentials.create(credentialOptions);

 ...

Теперь я могу без проблем войти в my-company.com. Но я НЕ МОГУ войти в систему на other.my-company.com и не понимаю почему. В диалоговом окне WebAuthn (из Win10) говорится, что Authenticator не распознается (не совсем так, поскольку сообщение написано на немецком языке).

Все, что я делаю, - это передаю навигатору действительные учетные данные (которые я получаю от бэкэнда).

...

const credIds: Array<PublicKeyCredentialDescriptor> = [];
credentialIds.forEach((credentialId) => {
  credIds.push({
    type: 'public-key',
    id: decodeUrlSafeB64(credentialId)
  });
});

// my-company.com --> WebAuthn Dialog as expected
// other.my-company.com --> WebAuthnDialog does not recognize key
navigator.credentials.get({
  publicKey: {
    challenge: challenge, // Challenge for Login from Backend
    allowCredentials: credIds,
    userVerification: 'preferred'
  }
});

...

Однако, когда я делаю регистрацию с other.my-company.com с помощью:

rp: {
  id: 'other.my-company.com',
  name: 'My Company'
},

Теперь я могу войти в систему с my-company.com И other.my-company.com. Это сработает для той настройки, которая у меня есть сейчас, но когда я когда-нибудь планирую расширить свой проект и войти в систему на another.my-company.com, это не сработает.

Я прочитал спецификацию, и в ней нет подробностей об этой настройке, хотя я считаю ее довольно распространенной: https://www.w3.org/TR/webauthn/#relying-party-identifier

В аналогичном вопросе SO он сказал, что установка, которая у меня здесь, должна работать (хотя и без какого-либо источника): WebAuthn в нескольких субдоменах

Я также следил за этим при реализации логики: https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API

Я не знаю, где искать. Реализация WebAuthn4J, которую я использую (https://github.com/webauthn4j/webauthn4j), работает нормально, как доказано, что я могу войти в две настройки сверху.

Единственный другой вариант, который я придумал, - это отделить весь процесс входа / регистрации от остальной части приложения, чтобы каждый вход перенаправлялся на sso.my-company.com, входил в систему с помощью WebAuthn, получал JWT и перенаправлял обратно в исходное приложение. Но действительно ли это единственный вариант, который у меня есть? Это кажется излишним для того, что я хочу сделать, а именно зарегистрировать домен и разрешить все поддомены.

Любая подсказка (даже указание только на другие спецификации, которые я связал)


person PrimuS    schedule 09.02.2021    source источник


Ответы (1)


Вам необходимо установить идентификатор RP во время утверждения, чтобы тот же идентификатор RP, который использовался при создании. Если вы оставите его не установленным, по умолчанию будет использоваться текущее происхождение и будет включен субдомен, поэтому он больше не будет совпадать.

person Nina Satragno    schedule 18.02.2021