Задать вопрос
vo0ov
@vo0ov
Кодер на python

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

Windows всегда требует вставить FIDO2-ключ, а у меня есть лишь PIN (Windows Hello). Как сделать, чтобы при вызове `navigator.credentials.get({ userVerification: "required" })` система запрашивала PIN, а не аппаратный ключ? Возможно ли вообще использование пароля ОС, если нет физического ключа? Пробовал это, но просит ключ, а не PIN:
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);
})();
  • Вопрос задан
  • 97 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@maxonklakson
Чтобы navigator.credentials.get использовал встроенный Windows Hello, у тебя должен быть:
credential, зарегистрированный через Windows Hello, то есть:
authenticatorAttachment: "platform" при создании (navigator.credentials.create)
user verification включён (например, PIN)
Иначе Windows будет звать последний известный способ — в твоем случае внешний ключ.
Что тебе нужно сделать
Заново зарегистрировать credential через navigator.credentials.create(), указав authenticatorAttachment: "platform":
const publicKey = {
  challenge: new Uint8Array(32),
  rp: { name: "Example Corp" },
  user: {
    id: new Uint8Array(16),
    name: "user@example.com",
    displayName: "User"
  },
  pubKeyCredParams: [{ alg: -7, type: "public-key" }],
  authenticatorSelection: {
    authenticatorAttachment: "platform",
    userVerification: "required",
    residentKey: "required"
  },
  timeout: 60000,
  attestation: "none"
};

const cred = await navigator.credentials.create({ publicKey });
console.log(cred);

Сохрани credentialId из полученного cred.rawId (в base64url).
При логине (через navigator.credentials.get) передавай этот ID.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mrusklon
@mrusklon
Не получается? Яростно гугли!
попробуй поигратся с residentKey: 'required' , вообще винда должна просить по приоритету, если ключ зарегистрирован просит его, если нет то что то другое

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

Войдите, чтобы написать ответ

Похожие вопросы