Guardar credenciales desde Formularios

Meggin Kearney
Meggin Kearney

Guarda las credenciales de los formularios de acceso

Asegúrate de que los formularios de registro y acceso sean lo más sencillos posible.

Guarda las credenciales de los formularios de acceso para que los usuarios no tengan que volver a acceder cuando regresen.

Para almacenar las credenciales de los usuarios de los formularios, sigue estos pasos:

  1. Incluye autocomplete en el formulario.
  2. Evita que se envíe el formulario.
  3. Para autenticarte, envía una solicitud.
  4. Almacena la credencial.
  5. Actualiza la IU o ve a la página personalizada.

Incluye autocomplete en el formulario

Antes de seguir adelante, Verifica si tu formulario incluye atributos autocomplete. Esto ayuda a la API de Credential Management a encontrar id y password del formulario y construir un objeto de credencial.

Esto también ayuda a los navegadores que no admiten la API de Credential Management para comprender su semántica. Obtén más información sobre Autocompletar en este artículo de Jason Grigsby.

<form id="signup" method="post">
  <input name="email" type="text" autocomplete="username email" />
  <input name="display-name" type="text" autocomplete="name" />
  <input name="password" type="password" autocomplete="new-password" />
  <input type="submit" value="Sign Up!" />
</form>

Impedir que se envíe el formulario

Cuando el usuario presiona el botón Enviar, evita que se envíe el formulario, ya que, de lo contrario, no se enviaría el formulario. generan una transición de página:

    var f = document.querySelector('#signup');
    f.addEventListener('submit', e => {
      e.preventDefault();

Al evitar la transición de una página, puedes conservar la información de las credenciales mientras verificas su autenticidad.

Autentica mediante el envío de una solicitud

Para autenticar al usuario, entrega la información de credenciales a tu servidor usando AJAX.

Del lado del servidor, crea un extremo (o simplemente altera un extremo existente) que responda con el código HTTP 200 o 401, de modo que el navegador si la contraseña de registro, acceso o cambio es correcta o no.

Por ejemplo:

// Try sign-in with AJAX
fetch('/signin', {
  method: 'POST',
  body: new FormData(e.target),
  credentials: 'include',
});

Almacena la credencial

Para almacenar una credencial, primero verifica si la API está disponible. y, luego, crea una instancia PasswordCredential con el elemento del formulario como argumento de forma síncrona o asíncrona. Llama a navigator.credentials.store(). Si la API no está disponible, puedes reenviar la información del perfil al siguiente paso.

Ejemplo síncrono:

if (window.PasswordCredential) {
  var c = new PasswordCredential(e.target);
  return navigator.credentials.store(c);
} else {
  return Promise.resolve(profile);
}

Ejemplo del modelo asíncrono:

if (window.PasswordCredential) {
  var c = await navigator.credentials.create({password: e.target});
  return navigator.credentials.store(c);
} else {
  return Promise.resolve(profile);
}

Una vez que la solicitud se realice de forma correcta, almacena la información de la credencial. (no almacenes la información de las credenciales si falló la solicitud ya que hacerlo confunde a los usuarios recurrentes).

Cuando el navegador Chrome obtiene información de credenciales, aparece una notificación en la que se solicita almacenar una credencial (o proveedor de federación).

almacenar credencial
Notificación para un usuario que accedió automáticamente

Cómo actualizar la IU

Si todo salió bien, actualiza la IU con la información del perfil o ir a la página personalizada.

     }).then(profile => {
       if (profile) {
         updateUI(profile);
       }
     }).catch(error => {
       showError('Sign-in Failed');
     });
    });

Ejemplo de código completo

// Get form's DOM object
var f = document.querySelector('#signup');
f.addEventListener('submit', (e) => {
  // Stop submitting form by itself
  e.preventDefault();

  // Try sign-in with AJAX
  fetch('/signin', {
    method: 'POST',
    body: new FormData(e.target),
    credentials: 'include',
  })
    .then((res) => {
      if (res.status == 200) {
        return Promise.resolve();
      } else {
        return Promise.reject('Sign-in failed');
      }
    })
    .then((profile) => {
      // Instantiate PasswordCredential with the form
      if (window.PasswordCredential) {
        var c = new PasswordCredential(e.target);
        return navigator.credentials.store(c);
      } else {
        return Promise.resolve(profile);
      }
    })
    .then((profile) => {
      // Successful sign-in
      if (profile) {
        updateUI(profile);
      }
    })
    .catch((error) => {
      // Sign-in failed
      showError('Sign-in Failed');
    });
});

Compatibilidad del navegador

PasswordCredential

Navegadores compatibles

  • 51
  • 79
  • x
  • x

Origen

Navegadores compatibles

  • 51
  • 79
  • 60
  • 13

Origen

Comentarios