Pubblicato: 12 novembre 2024, ultimo aggiornamento: 29 novembre 2024
L'API WebAuthn Signal consente alle parti che fanno affidamento di segnalare le credenziali esistenti ai fornitori di passkey collegati. In questo modo, un provider di passkey supportato può aggiornare o rimuovere passkey errate o revocate dal proprio spazio di archiviazione in modo che non vengano più offerte agli utenti.
Compatibilità
Chrome su computer supporta l'API Signal a partire da Chrome 132. Gestore delle password di Google può aggiornare le passkey in base al segnale. Per i fornitori di passkey basati su estensioni di Chrome, spetta a loro decidere se riflettere o meno l'indicatore.
Il supporto di Chrome su Android sarà disponibile in un secondo momento.
Safari è supportato ma non ancora implementato. Firefox non ha ancora condiviso le proprie opinioni.
Sfondo
Quando viene creata una passkey (una credenziale rilevabile), i metadati come un nome utente e un nome visualizzato vengono salvati nel provider di passkey (ad esempio un gestore delle password) insieme alla chiave privata, mentre la credenziale della chiave pubblica viene salvata sul server della relying party (RP). Il salvataggio del nome utente e del nome visualizzato aiuta l'utente a identificare con quale delle passkey offerte accedere quando richiesto. Questa funzionalità è particolarmente utile quando l'utente ha più di due passkey di diversi fornitori.
Tuttavia, in un paio di casi, le incoerenze tra l'elenco delle passkey del provider e l'elenco delle credenziali del server possono generare confusione.
Il primo caso si verifica quando un utente elimina una credenziale sul server lasciando la passkey nel provider di passkey intatta. La prossima volta che l'utente proverà ad accedere con una passkey, questa verrà comunque presentata all'utente dal provider di passkey. Tuttavia, il tentativo di accesso non andrà a buon fine perché il server non sarà in grado di eseguire la verifica con la chiave pubblica eliminata.
Il secondo caso si verifica quando un utente aggiorna il proprio nome utente o il nome visualizzato sul server. La volta successiva che l'utente tenta di accedere, la passkey nel provider di passkey continua a mostrare il vecchio nome utente e il nome visualizzato nonostante sia stato aggiornato sul server. Idealmente, dovrebbero essere sincronizzati.
API Signal
L'API Signal è un'API WebAuthn che risolve questi problemi consentendo alle RP di segnalare le modifiche al fornitore di passkey. Esistono tre metodi:
PublicKeyCredential.signalUnknownCredential
: Segnale che indica che una credenziale non esistePublicKeyCredential.signalAllAcceptedCredentials
: Visualizza un elenco di credenziali salvatePublicKeyCredential.signalCurrentUserDetails
: Nome utente e/o nome visualizzato di Signal aggiornati
Segnala che una credenziale non esiste
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.
...
}
}
Chiamando PublicKeyCredential.signalUnknownCredential()
con un ID RP e un ID credenziale, l'RP può comunicare al fornitore di passkey che la credenziale specificata è stata rimossa o non esiste. Spetta al fornitore di passkey
decidere come gestire questo segnale, ma la passkey associata deve essere
rimossa in modo che l'utente non possa accedere con una passkey perché le credenziali
associate non esistono.
Questa API può essere richiamata quando l'accesso basato su passkey non è riuscito a causa dell'assenza di una credenziale. In questo modo, il RP può impedire all'utente di tentare
di accedere con una passkey che non ha credenziali associate. A differenza di
signalAllAcceptedCredentials
, questo metodo non richiede il passaggio dell'intero
elenco di ID credenziali, pertanto deve essere utilizzato ogni volta che l'utente non è
autenticato per evitare di rivelare il numero di passkey per un determinato utente.

Segnalare un elenco di credenziali salvate
// 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",
...
]
});
}
Chiamando PublicKeyCredential.signalAllAcceptedCredentials()
con un ID RP, un ID utente e un elenco di ID credenziali delle credenziali memorizzate, l'RP può comunicare al fornitore di passkey le credenziali rimanenti nel suo spazio di archiviazione. Spetta al
fornitore di passkey decidere come gestire questo segnale, ma le passkey che non
corrispondono a questo elenco dovrebbero essere rimosse in modo che l'utente non veda passkey
all'accesso per le quali non esiste la credenziale associata.
Questa API deve essere richiamata quando un utente elimina una passkey sul RP e a ogni accesso, in modo che il fornitore di passkey possa mantenere un elenco sincronizzato di passkey.
Indicatore con nome utente e nome visualizzato aggiornati
// 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 {
}
Chiamando PublicKeyCredential.signalCurrentUserDetails()
con un ID RP, un ID utente, un nome utente e un nome visualizzato, l'RP può comunicare al fornitore di passkey le informazioni aggiornate dell'utente. Spetta al fornitore di passkey decidere come gestire
questo segnale, ma le passkey di proprietà dell'utente devono essere aggiornate con
le nuove informazioni utente.
Questa API può essere richiamata quando vengono aggiornati il nome utente o il nome visualizzato dell'utente e a ogni accesso, in modo che il fornitore di passkey possa mantenere queste informazioni sincronizzate con il server.

Riepilogo
L'API Signal ti aiuta a creare un'esperienza con le passkey migliore eliminando le possibilità di errori di accesso imprevisti. Con l'API Signal, le relying party possono segnalare l'elenco delle credenziali esistenti e i relativi metadati, in modo da mantenere sincronizzate le passkey sul provider di passkey.
Per saperne di più sulle passkey, inizia da Accesso senza password con le passkey.