Как включить проверку пароля или 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' , вообще винда должна просить по приоритету, если ключ зарегистрирован просит его, если нет то что то другое <br/> <br/> upd <br/> гугл говорит <br/> Убираем allowCredentials, чтобы Windows могла выбрать любой доступный метод. <br/> Убираем authenticatorSelection, чтобы система автоматически выбрала доступный способ аутентификации. <br/> Оставляем userVerification: "required", чтобы потребовать PIN.
Похожие вопросы