У меня есть проект 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 и перенаправлял обратно в исходное приложение. Но действительно ли это единственный вариант, который у меня есть? Это кажется излишним для того, что я хочу сделать, а именно зарегистрировать домен и разрешить все поддомены.
Любая подсказка (даже указание только на другие спецификации, которые я связал)