Как использовать учетные данные FIDO с WebAuthn на мобильных устройствах

Я реализовал U2F на основе настольного браузера, используя встроенный в firefox и chrome-with-javascript API U2F. Я следовал базовому рецепту здесь:

https://github.com/castle/ruby-u2f

Для каждого физического устройства у меня есть 4 атрибута:

  • свидетельство
  • key_handle
  • public_key
  • прилавок

Я верю, но не уверен, что, собрав эту информацию об этом физическом устройстве, я теперь могу перепрофилировать ее при рендеринге той же веб-страницы на мобильном устройстве для реализации WebAuthn, который вместо рендеринга веб-страницы для пользователя для аутентификации отобразит интерфейс мобильной ОС для запроса аутентификации NFC (если устройство имеет NFC).

Я пытаюсь использовать 4 атрибута выше для рендеринга javascript с помощью nav.credentials.get, но я застрял.

Мне не ясно, что из следующего верно

A) Вы МОЖЕТЕ использовать учетные данные / информацию, собранные и проверенные в процессе регистрации устройства U2F на настольном компьютере, для аутентификации на мобильном устройстве с веб-аутентификацией.

Б) Если вы хотите использовать веб-аутентификацию на мобильном телефоне, чтобы он мог запускать собственный мобильный процесс аутентификации NFC, вы должны, в дополнение к обычному потоку U2F, также тайно обрабатывать регистрацию webauthn (под "секретом" я не имею в виду вас намеренно не сообщаем пользователю, что он это делает, а скорее, пользователь не осознает различие между A и B).

Следуя приведенному выше примеру, их javascript выглядит примерно так:

var appId = <%= @app_id.to_json.html_safe %>
var registerRequests = <%= @registration_requests.to_json.html_safe %>;
var signRequests = <%= @sign_requests.as_json.to_json.html_safe %>;

u2f.register(appId, registerRequests, signRequests, function(registerResponse) {
  var form, reg;

  if (registerResponse.errorCode) {
    return alert("Registration error: " + registerResponse.errorCode);
  }

  form = document.forms[0];
  response = document.querySelector('[name=response]');

  response.value = JSON.stringify(registerResponse);

  form.submit();
});

Используя пример Mozilla здесь:

https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions

Я пытаюсь адаптировать это к чему-то вроде:

var appId = <%= @app_id.to_json.html_safe %>
var registerRequests = <%= @registration_requests.to_json.html_safe %>;
var signRequests = <%= @sign_requests.as_json.to_json.html_safe %>;


var options = {
  challenge: new Uint8Array([/* bytes sent from the server */]),
  rpId: "example.com" /* will only work if the current domain
                         is something like foo.example.com */
  userVerification: "preferred",
  timeout: 60000,     // Wait for a minute
  allowCredentials: [
    {
      transports: "usb",
      type: "public-key",
      id: new Uint8Array(26) // actually provided by the server
    },
    {
      transports: "internal",
      type: "public-key",
      id: new Uint8Array(26) // actually provided by the server
    }
  ],
  extensions: {
    uvm: true,  // RP wants to know how the user was verified
    loc: false,
    txAuthSimple: "Could you please verify yourself?"
  }
};

navigator.credentials.get({ "publicKey": options })
    .then(function (credentialInfoAssertion) {
    // send assertion response back to the server
    // to proceed with the control of the credential

    // update the hidden form input then
    form.submit();
}).catch(function (err) {
     console.error(err);
});

Но неясно, как я сопоставляю атрибуты U2F с атрибутами webauthn. Кажется, я не могу найти конкретный пример этой работы, но я уверен, что он действительно работает, потому что GitHub и DropBox имеют этот точный поток - вы регистрируете устройство U2F в настольной сети, а затем устройство NFC можно использовать на собственном мобильном устройстве. .

Между прочим, причина, по которой я хочу это реализовать, заключается в том, что пользователю на родном мобильном устройстве никогда не нужно покидать ваше веб-приложение, отображается собственный интерфейс NFC, и они волшебным образом возвращаются в ваше веб-приложение. В настоящее время у меня есть, если обнаружен мобильный телефон, визуализировать интерфейс OTP, который требует, чтобы пользователь переключился на приложение для проверки подлинности, такое как Authy, а затем скопируйте OTP и вернитесь в мобильный Интернет. Гораздо приятнее просто вытащить свой ключ и нажать на него.

Спасибо за любую помощь, Кевин


person user1130176    schedule 17.12.2019    source источник
comment
При вызове navigator.credentials.get() в сценарии 2FA наиболее важным является массив allowedCredentials. Это список идентификаторов учетных данных (которые, вероятно, соответствуют вашему key_handle), принадлежащих соответствующему пользователю. Я считаю (нет личного опыта этого) в сценарии миграции U2F другим важным битом является rpId, который должен быть установлен на исходное имя хоста, для которого был зарегистрирован ключ.   -  person mackie    schedule 17.12.2019


Ответы (1)


При использовании navigator.credentials.get () не забудьте установить расширения: {appid: u2f_appid}, то есть параметр U2F appId во время вызова u2f.register. В моем случае я использовал URL-адрес доверенного списка origins.json.

https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions/extensions

Причина, по которой вам нужно установить параметр extensions.appid, заключается в том, что в случае сбоя WebAuthn rpId он вернется к более старому U2F с помощью параметра extensions.appid.

person LAX_DEV    schedule 27.05.2020