Как включить проверку пароля или PIN в Windows Hello, если система требует USB-ключ?

Как сделать так, чтобы при вызове `navigator.credentials.get({ userVerification: "required" })` в Windows запрашивался PIN от Windows Hello вместо физического FIDO2-ключа? Возможно ли использовать пароль операционной системы, если аппаратный ключ отсутствует? Я пытался это сделать, но система всё равно требует ключ. Вот мой код:  
```javascript
const credentialId = "AQIDBAUGBwgJ";  

function base64ToArrayBuffer(base64String) {
  const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
  const base64 = (base64String + padding)
    .replace(/\-/g, '+')
    .replace(/_/g, '/');
  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);
  for (let i = 0; i < rawData.length; i++) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray.buffer;
}

const challengeBytes = new Uint8Array([21, 57, 200, 13, 99, 42]);

const publicKey = {
  challenge: challengeBytes,
  allowCredentials: [{
    id: base64ToArrayBuffer(credentialId),
    type: "public-key"
  }],
  userVerification: "required",
  authenticatorSelection: {
      authenticatorAttachment: 'platform',
      residentKey: 'required'
    }
};

(async () => {
  const assertion = await navigator.credentials.get({ publicKey });
  console.log(assertion);
})();
```
  • 2 апреля 2025 г. 11:15
Ответы на вопрос 2
Ваша проблема, судя по всему, связана с требованием системы использовать аппаратный ключ для аутентификации с помощью FIDO2. Windows Hello позволяет использовать как аппаратные средства (например, USB-ключи), так и более программные варианты (например, PIN-код или биометрия). Тем не менее, когда вы запрашиваете `userVerification: "required"`, система может по умолчанию требовать внешние устройства.

### Как включить проверку пароля или PIN вместо USB-ключа
Чтобы использовать PIN-код Windows Hello вместо физического FIDO2-ключа, вам нужно немного изменить конфигурацию вашей аутентификации.

1. **Измените `userVerification`**: Попробуйте использовать значение `"preferred"` вместо `"required"` для `userVerification`. Это позволит системе сначала пытаться проверить пользователя через PIN или биометрию:

    ```javascript
    const publicKey = {
      challenge: challengeBytes,
      allowCredentials: [{
        id: base64ToArrayBuffer(credentialId),
        type: "public-key"
      }],
      userVerification: "preferred", // изменено на "preferred"
      authenticatorSelection: {
        authenticatorAttachment: 'platform',
        residentKey: 'required'
      }
    };
    ```

2. **Проверьте настройки Windows Hello**: Убедитесь, что в настройках вашей системы Windows Hello включены методы аутентификации, такие как PIN-код или биометрия.

3. **Не используйте физическое устройство**: Убедитесь, что в вашем коде не указано использование внешнего USB-ключа как единственного метода. Это может ограничить ваше приложение и заставить его требовать физический ключ.

### Пароль в качестве альтернативы
К сожалению, использование пароля в качестве метода аутентификации через `navigator.credentials.get` в контексте WebAuthn и FIDO2 не поддерживается. Эти методы аутентификации ориентированы на использование ключей, Хранителей (объектов аутентификации), и сам процесс не предусматривает работу с традиционным паролем. 

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

Если вас интересуют дальнейшие шаги или возможные альтернативы, пожалуйста, дайте знать!
попробуй поигратся с residentKey: 'required' , вообще винда должна просить по приоритету, если ключ зарегистрирован просит его, если нет то что то другое 

upd
гугл говорит
Убираем allowCredentials, чтобы Windows могла выбрать любой доступный метод.
Убираем authenticatorSelection, чтобы система автоматически выбрала доступный способ аутентификации.
Оставляем userVerification: "required", чтобы потребовать PIN.
Похожие вопросы