Показать сообщение отдельно
  #1 (permalink)  
Старый 07.12.2021, 23:27
Профессор
Отправить личное сообщение для dima85 Посмотреть профиль Найти все сообщения от dima85
 
Регистрация: 14.03.2010
Сообщений: 194

Технология u2f, Yubico, покажите несколько простых примеров.
Сориентируйте пожалуйста в технологии FIDO U2f USB Security Key.

Ниже приведенный код работает. Но я не совсем понимаю что он делает.

Например, нажав на кнопку мы делаем запрос к u2f.json - Зачем, что это за ключ?
Я читал для безопасности в коде URL где-то указывается обратный домен. Но здесь я его не вижу, или я что-то путаю.


/index.html
<html>

<head>
  <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">

  <title>Add a auth token</title>
</head>
<body>
  <script type="text/javascript">

    const userId = "some value from your application"

    const getCredential = async (userId) => {

      const response = await fetch('/u2f.json')
      if (!response.ok) {
        throw new Error('response error')
      }
      // endpoint returns a simple json-encoded string
      const challenge = await response.json()
      console.debug('Challege', challenge)

      const options = {
        rp: {
          name: "Example Site",
        },
        user: {
          id: Uint8Array.from(userId, c => c.charCodeAt(0)),
          name: "user@example.com",
          displayName: "User Name",
        },
        challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)),
        pubKeyCredParams: [{
          alg: -7,
          type: "public-key"
        }],
        timeout: 10000,
        // ms
        authenticatorSelection: {
          authenticatorAttachment: "cross-platform",
          userVerification: "preferred",
        },
        attestation: "direct"
      }

      console.debug('options', options)

      // If the user completes registration, this value will hold the data to POST to your application
      const credential = await navigator.credentials.create({
        publicKey: options
      })

      console.debug('credential', credential)

      // Format the user's `credential` and POST it to your application:

      const dataToSend = {
        rawId: new Uint8Array(credential.rawId),
        type: credential.type,
        response: {
          attestationObject: new Uint8Array(credential.response.attestationObject),
          clientDataJSON: new Uint8Array(credential.response.clientDataJSON),
        },
      }



      const registerResponse = await fetch(request)
      console.debug('registerResponse', registerResponse)
      if (registerResponse.ok) {
        alert('token registered, go back to log in with it')
      }

    }

    function start() {
      getCredential(userId)
    }
  </script>

  <button onclick="start()">Click to start</button>
</body>
</html>


/u2f.json
"VvBKmmsZd2RksGdI8NimSg"
Ответить с цитированием