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. Esto permite que un proveedor de llaves de acceso compatible actualice o quite llaves de acceso incorrectas o revocadas de su almacenamiento para que ya no se ofrezcan a los usuarios.
Compatibilidad
Chrome admite la API de Signal en todas las plataformas para computadoras y en Android.
Safari es compatible, pero aún no se implementó. Firefox aún no compartió su opinión.
El Administrador de contraseñas de Google puede actualizar las llaves de acceso para reflejar el indicador. Los proveedores de claves de acceso basados en extensiones de Chrome para computadoras deciden si reflejan el indicador.
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 a los usuarios a identificar qué llaves de acceso ofrecidas usar para acceder cuando se les solicite. Esto es especialmente útil cuando los usuarios tienen más de dos llaves de acceso de diferentes proveedores.
Sin embargo, hay algunos casos en los que las incoherencias entre la lista de claves de acceso del proveedor y la lista de credenciales del servidor pueden causar confusión.
El primer caso es cuando un usuario borra una credencial en el servidor. Esto 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 seguirá presentando esa llave al usuario. Sin embargo, el intento de acceso fallará porque el servidor no puede verificar la clave pública que se borró.
El segundo caso se da cuando un usuario actualiza su nombre de usuario o 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, aunque se hayan actualizado en el servidor. Idealmente, estos deben estar sincronizados.
API de Signal
La API de Signal es una API de WebAuthn que resuelve estas incoherencias, ya que permite que los RP indiquen cambios al proveedor de llaves de acceso. Existen tres métodos:
PublicKeyCredential.signalUnknownCredential: Indica que no existe una credencial.PublicKeyCredential.signalAllAcceptedCredentials: Indica una lista de credenciales guardadasPublicKeyCredential.signalCurrentUserDetails: Se actualizaron el nombre de usuario y el nombre visible del indicador.
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 determina cómo controlar este indicador, pero se debe quitar la llave de acceso asociada para que los usuarios no intenten acceder con una llave de acceso que no tenga una credencial asociada.
Se puede invocar esta API cuando falla el acceso basado en llave de acceso porque falta una credencial.
De esta manera, el RP puede evitar que los usuarios intenten acceder con una llave de acceso que no tenga una credencial asociada. A diferencia de signalAllAcceptedCredentials, este método no requiere que pases toda la lista de IDs de credenciales, por lo que debes usarlo siempre que el usuario no esté autenticado para evitar revelar la cantidad de llaves de acceso de un usuario determinado.
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",
...
]
});
}
Usa PublicKeyCredential.signalAllAcceptedCredentials() después de que un usuario acceda o administre la configuración de la cuenta. Proporcionas una lista de todos los IDs de credenciales válidos para ese usuario. El proveedor de llaves de acceso compara esta lista con su almacenamiento local para esa entidad de confianza. El proveedor de llaves de acceso marca como "oculta" cualquier llave de acceso que se encuentre en su almacenamiento y que no esté incluida en la lista allAcceptedCredentialIds.
El sistema ya no ofrece estas llaves de acceso ocultas para el acceso o el autocompletado, pero no se borran de inmediato de forma permanente, lo que permite restaurarlas si es necesario.
Por el contrario, el proveedor de llaves de acceso restablece las llaves de acceso presentes en allAcceptedCredentialIds que están marcadas como "ocultas".
Esto permite que tu sitio web restablezca las llaves de acceso que se ocultaron por error.
Invoca 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 se 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 llaves de acceso determina cómo controlar este indicador, pero debe actualizar las llaves de acceso que posee el usuario con la nueva información del usuario.
Se puede invocar esta API cuando se actualiza el nombre de usuario o el nombre visible del usuario y en cada inicio de sesión para que el proveedor de claves de acceso pueda mantener esta información sincronizada con el servidor.
Resumen
La API de Signal te ayuda a crear una mejor experiencia con las llaves de acceso, ya que elimina los errores inesperados de acceso. La API de Signal permite que los usuarios de confianza indiquen 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.