Mantén la coherencia de las llaves de acceso con las credenciales de tu servidor con la API de Signal

Fecha de publicación: 12 de noviembre de 2024; última actualización: 29 de noviembre de 2024

La API de WebAuthn Signal permite que los usuarios de confianza indiquen credenciales existentes a los proveedores de llaves de acceso conectados. Con esto, un proveedor de llaves de acceso compatible puede actualizar o quitar llaves de acceso incorrectas o revocadas de su almacenamiento para que ya no se ofrezcan a los usuarios.

Compatibilidad

Chrome para computadoras admite la API de Signal a partir de Chrome 132. El Administrador de contraseñas de Google puede actualizar las llaves de acceso para reflejar el indicador. En el caso de los proveedores de llaves de acceso basados en extensiones de Chrome, depende de ellos si reflejarán el indicador o no.

La compatibilidad con Chrome en Android estará disponible más adelante.

Safari es compatible, pero aún no se implementó. Firefox aún no compartió sus opiniones.

Fondo

Cuando se crea una llave de acceso (una credencial detectable), se guardan metadatos, como un nombre de usuario y un nombre visible, en el proveedor de llaves de acceso (como un administrador de contraseñas) junto con la clave privada, mientras que la credencial de clave pública se guarda en el servidor de la parte que confía (RP). Guardar el nombre de usuario y el nombre visible ayuda al usuario a identificar con cuál de las llaves de acceso ofrecidas debe acceder cuando se le solicite. Esto es especialmente útil cuando tienen más de dos llaves de acceso de diferentes proveedores.

Sin embargo, hay algunos casos en los que las inconsistencias entre la lista de claves de acceso del proveedor y la lista de credenciales del servidor pueden generar confusión.

El primer caso es cuando un usuario borra una credencial en el servidor, lo que deja la llave de acceso intacta en el proveedor de llaves de acceso. La próxima vez que el usuario intente acceder con una llave de acceso, el proveedor de llaves de acceso se la seguirá presentando. Sin embargo, el intento de acceso fallará porque el servidor no podrá realizar la verificación con la clave pública que se borró.

El segundo caso se da cuando un usuario actualiza su nombre de usuario o el nombre visible en el servidor. La próxima vez que el usuario intente acceder, la llave de acceso en el proveedor de llaves de acceso seguirá mostrando el nombre de usuario y el nombre visible anteriores, a pesar de que se actualizaron en el servidor. Lo ideal es que estén sincronizados.

API de Signal

La API de Signal es una API de WebAuthn que resuelve estas confusiones, ya que permite que los RP indiquen cambios al proveedor de llaves de acceso. Existen tres métodos:

Indica que no existe una credencial

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

Si llama a PublicKeyCredential.signalUnknownCredential() con un ID de RP y un ID de credencial, el RP puede informar al proveedor de claves de acceso que se quitó la credencial especificada o que no existe. El proveedor de llaves de acceso decide cómo controlar este indicador, pero se espera que se quite la llave de acceso asociada para que el usuario no acceda con una llave de acceso, ya que no existe la credencial asociada.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Se puede invocar esta API cuando falla el acceso con llave de acceso por falta de credenciales. De esta manera, el RP puede evitar que el usuario intente acceder con una llave de acceso que no tenga una credencial asociada. A diferencia de signalAllAcceptedCredentials, este método no requiere que se pase la lista completa de IDs de credenciales, por lo que se debe usar siempre que el usuario no esté autenticado para evitar revelar la cantidad de llaves de acceso de un usuario determinado.

Es un diálogo que se muestra cuando se borra una llave de acceso del Administrador de contraseñas de Google en Chrome.
Diálogo que se muestra cuando se borra una llave de acceso del Administrador de contraseñas de Google en Chrome.

Indica una lista de credenciales guardadas

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

Si llama a PublicKeyCredential.signalAllAcceptedCredentials() con un ID de RP, un ID de usuario y una lista de IDs de credenciales almacenadas, el RP puede informar al proveedor de claves de acceso sobre las credenciales restantes en su almacenamiento. Depende del proveedor de llaves de acceso cómo manejar este indicador, pero se espera que se quiten las llaves de acceso que no coincidan con esta lista para que el usuario no vea llaves de acceso en el acceso para las que no exista la credencial asociada.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Se debe invocar esta API cuando un usuario borra una llave de acceso en el RP y en cada acceso, de modo que el proveedor de llaves de acceso pueda mantener una lista sincronizada de llaves de acceso.

Se actualizaron el nombre de usuario y el nombre visible del indicador

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

Si llama a PublicKeyCredential.signalCurrentUserDetails() con un ID de RP, un ID de usuario, un nombre de usuario y un nombre visible, el RP puede informar al proveedor de claves de acceso sobre la información del usuario actualizada. El proveedor de la llave de acceso decide cómo controlar este indicador, pero se espera que las llaves de acceso que posee el usuario se actualicen con la nueva información del usuario.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Se puede invocar esta API cuando se actualiza el nombre de usuario o el nombre visible del usuario y en cada acceso para que el proveedor de claves de acceso pueda mantener esta información sincronizada con el servidor.

Es un diálogo que se muestra cuando se actualizan los metadatos de una llave de acceso en el Administrador de contraseñas de Google en Chrome.
Diálogo que se muestra cuando se actualizan los metadatos de una llave de acceso en el Administrador de contraseñas de Google en Chrome.

Resumen

La API de Signal te ayuda a crear una mejor experiencia con las llaves de acceso, ya que elimina las posibilidades de que se produzcan errores inesperados de acceso. Con la API de Signal, los usuarios de confianza pueden indicar la lista de credenciales existentes y sus metadatos, de modo que puedan mantener sincronizadas las llaves de acceso en el proveedor de llaves de acceso.

Para obtener más información sobre las llaves de acceso, consulta Acceso sin contraseña con llaves de acceso.