Я реализовал 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 и вернитесь в мобильный Интернет. Гораздо приятнее просто вытащить свой ключ и нажать на него.
Спасибо за любую помощь, Кевин
navigator.credentials.get()
в сценарии 2FA наиболее важным является массивallowedCredentials
. Это список идентификаторов учетных данных (которые, вероятно, соответствуют вашемуkey_handle
), принадлежащих соответствующему пользователю. Я считаю (нет личного опыта этого) в сценарии миграции U2F другим важным битом являетсяrpId
, который должен быть установлен на исходное имя хоста, для которого был зарегистрирован ключ. - person mackie   schedule 17.12.2019