CyberDeck/devise-fido-u2f

View on GitHub
app/views/devise/fido_usf_registrations/new.html.erb

Summary

Maintainability
Test Coverage
<h2>Register key</h2>
<p>Please insert the key and press the button within 15 seconds</p>
<p id="waiting">Waiting...</p>
<p id="error" class="d-none"></p>

<%= form_tag send("#{resource_name}_fido_usf_registration_path"), method: 'post' do %>
  <%= hidden_field_tag :response %>
<% end %>

<%= javascript_tag nonce: true do -%>
  var appId = <%= @app_id.to_json.html_safe %>;
  var registerRequests = <%= @registration_requests.to_json.html_safe %>;
  var signRequests = <%= @sign_requests.to_json.html_safe %>;
  var $waiting = document.getElementById('waiting');
  var $error = document.getElementById('error');
  var errorMap = {
    1: 'Unknown error, try again',
    2: "Bad request error, try again" ,
    3: "This key isn't supported, please try another one",
    4: 'The device is already registered, please login',
    5: 'Authentication timed out. Please reload to try again.'
  };
  var setError = function(code) {
    $waiting.className += ' d-none';
    $error.className = $error.className.replace(/\bd-none\b/g, '');
    $error.innerHTML = errorMap[code];
  };

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

    if (registerResponse.errorCode) {
      return setError(registerResponse.errorCode);
    }

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

    response.value = JSON.stringify(registerResponse);

    form.submit();
  }, 15);
<% end -%>