Mantenere le passkey coerenti con le credenziali sul server con l'API Signal

Data di pubblicazione: 12 novembre 2024

L'API WebAuthn Signal consente alle parti attendibili di segnalare le credenziali esistenti ai fornitori di passkey collegati. In questo modo, un provider di passkey supportato può aggiornare o rimuovere le 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 all'indicatore. Per i fornitori di passkey basati su estensioni di Chrome, è a loro discrezione decidere se riflettere o meno l'indicatore.

Il supporto di Chrome su Android sarà disponibile in un secondo momento.

Safari è supportato, ma non è ancora stato implementato. Firefox non ha ancora condiviso le sue opinioni.

Sfondo

Quando viene creata una passkey (una credenziale rilevabile), i metadati come un nome utente e un nome visualizzato vengono salvati nel fornitore di passkey (ad esempio un gestore delle password) insieme alla chiave privata, mentre la credenziale della chiave pubblica viene salvata nel server della terza parte attendibile (RP). Il salvataggio del nome utente e del nome visualizzato aiuta l'utente a identificare con quale delle passkey offerte eseguire l'accesso quando richiesto. Questa operazione è particolarmente utile se hanno più di due passkey di fornitori diversi.

Tuttavia, in alcuni casi le incoerenze tra l'elenco delle passkey del fornitore e l'elenco delle credenziali del server possono creare confusione.

Il primo caso si verifica quando un utente elimina una credenziale sul server lasciando invariata la passkey nel fornitore di passkey. La volta successiva che l'utente tenterà di accedere con una passkey, questa verrà comunque presentata dall'utente al provider di passkey. Tuttavia, il tentativo di accesso non andrà a buon fine perché il server non potrà effettuare la verifica con la chiave pubblica che è stata eliminata.

Il secondo caso si verifica quando un utente aggiorna il proprio nome utente o il nome visualizzato sul server. Al successivo accesso dell'utente, la passkey nel fornitore di passkey continua a mostrare il vecchio nome utente e il vecchio nome visualizzato, nonostante sia stata aggiornata sul server. Idealmente dovrebbero essere sincronizzati.

API Signal

L'API Signal è un'API WebAuthn che risolve queste confusioni consentendo agli RP di segnalare le modifiche al provider di passkey. Esistono tre metodi:

Indicare 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 credenza, l'RP può informare il fornitore della passkey che la credenza specificata è stata rimossa o non esiste. Spetta al fornitore della passkey gestire questo indicatore, ma la passkey associata dovrebbe essere rimossa in modo che l'utente non possa accedere con una passkey perché la credenziale associata non esiste.

Questa API può essere invocata quando l'accesso con passkey non è andato a buon fine a causa dell'assenza di una credenziale. In questo modo, l'RP può impedire all'utente di tentare di accedere con una passkey a cui non è associata una credenziale. A differenza di signalAllAcceptedCredentials, questo metodo non richiede di passare l'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.

Una finestra di dialogo visualizzata quando una passkey viene eliminata da Gestore delle password di Google su Chrome.
Una finestra di dialogo visualizzata quando una passkey viene eliminata da Gestore delle password di Google su Chrome.

Segnale 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 archiviate, l'RP può informare il fornitore di passkey delle credenziali rimanenti nel proprio spazio di archiviazione. Spetta al fornitore di passkey decidere come gestire questo indicatore, ma le passkey che non corrispondono a questo elenco dovrebbero essere rimosse in modo che l'utente non veda le passkey al momento dell'accesso per le quali non esiste la credenziale associata.

Questa API deve essere invocata quando un utente elimina una passkey sull'RP e su ogni accesso, in modo che il fornitore di passkey possa mantenere un elenco sincronizzato di passkey.

Segnale di aggiornamento del nome utente e del nome visualizzato

// 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ò informare il fornitore di passkey delle informazioni utente aggiornate. Spetta al fornitore di passkey decidere come gestire questo indicatore, ma le passkey di proprietà dell'utente dovrebbero essere aggiornate con le nuove informazioni dell'utente.

Questa API può essere richiamata quando il nome utente o il nome visualizzato dell'utente vengono aggiornati e a ogni accesso, in modo che il fornitore di passkey possa mantenere queste informazioni sincronizzate con il server.

Una finestra di dialogo visualizzata quando i metadati di una passkey vengono aggiornati in Gestore delle password di Google su Chrome.
Una finestra di dialogo visualizzata quando i metadati di una passkey vengono aggiornati in Gestore delle password di Google su Chrome.

Riepilogo

L'API Signal ti aiuta a creare un'esperienza con le passkey migliore eliminando le probabilità di errori di accesso imprevisti. Con l'API Signal, le parti interessate possono segnalare l'elenco delle credenziali esistenti e i relativi metadati, in modo da mantenere sincronizzate le passkey sul provider di passkey.

Per scoprire di più sulle passkey, consulta Accesso senza password con le passkey.