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

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. Ciò consente a un fornitore di passkey supportato di aggiornare o rimuovere passkey errate o revocate dal proprio spazio di archiviazione in modo che non vengano più offerte agli utenti.

Compatibilità

Chrome supporta l'API Signal su tutte le piattaforme desktop e Android.

Safari è supportato ma non ancora implementato. Firefox non ha ancora espresso il suo parere.

Gestore delle password di Google può aggiornare le passkey in modo che riflettano il segnale. I fornitori di passkey basati su estensioni di Chrome su computer decidono se riflettere il segnale.

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 gli utenti a identificare le passkey offerte da utilizzare per l'accesso quando richiesto. Questa operazione è particolarmente utile quando gli utenti hanno più di due passkey di diversi fornitori.

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

Il primo caso si verifica quando un utente elimina una credenziale sul server. La passkey rimane invariata nel provider di passkey. La volta successiva che l'utente tenta di accedere con una passkey, il provider della passkey presenta comunque la passkey all'utente. Tuttavia, il tentativo di accesso non andrà a buon fine perché il server non può verificare la chiave pubblica eliminata.

Il secondo caso si verifica quando un utente aggiorna il proprio nome utente o 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 nome visualizzato anche se è stato aggiornato sul server. Idealmente, questi elementi sono sincronizzati.

API Signal

L'API Signal è un'API WebAuthn che risolve queste incongruenze consentendo alle RP di segnalare le modifiche al fornitore di passkey. Esistono tre metodi:

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. Il fornitore di passkey determina come gestire questo segnale, ma la passkey associata deve essere rimossa in modo che gli utenti non tentino di accedere con una passkey priva di credenziali associate.

Browser Support

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

Source

Questa API può essere richiamata quando l'accesso basato su passkey non è riuscito perché manca una credenziale. In questo modo, il RP può impedire agli utenti di tentare di accedere con una passkey che non ha credenziali associate. A differenza di signalAllAcceptedCredentials, questo metodo non richiede di superare l'intero elenco di ID credenziali, quindi utilizzalo 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 dal Gestore delle password di Google su Chrome.

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",
      ...
    ]
  });
}

Utilizza PublicKeyCredential.signalAllAcceptedCredentials() dopo che un utente ha eseguito l'accesso o gestisce le impostazioni dell'account. Fornisci un elenco di tutti gli ID credenziali validi per l'utente. Il fornitore di passkey confronta questo elenco con lo spazio di archiviazione locale per la relying party. Il fornitore di passkey contrassegna come "nascosta" qualsiasi passkey trovata nel suo spazio di archiviazione che non è inclusa nell'elenco allAcceptedCredentialIds. Il sistema non offre più queste passkey nascoste per l'accesso o il riempimento automatico, ma non vengono eliminate immediatamente in modo permanente, il che consente il ripristino, se necessario. Al contrario, il fornitore di passkey ripristina le passkey presenti in allAcceptedCredentialIds contrassegnate come "nascoste". In questo modo, il tuo sito web può ripristinare le passkey nascoste per errore.

Browser Support

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

Source

Richiama questa API 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.

Signal ha aggiornato il nome utente e il 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ò comunicare al fornitore di passkey le informazioni aggiornate dell'utente. Il fornitore di passkey determina come gestire questo segnale, ma deve aggiornare le passkey di proprietà dell'utente con le nuove informazioni utente.

Browser Support

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

Source

Questa API può essere richiamata quando il nome utente o il nome visualizzato dell'utente viene aggiornato 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 nel Gestore delle password di Google su Chrome.

Riepilogo

L'API Signal ti aiuta a creare un'esperienza con le passkey migliore eliminando gli errori di accesso imprevisti. L'API Signal consente alle relying party di segnalare l'elenco delle credenziali esistenti e i relativi metadati, in modo da poter mantenere sincronizzate le passkey sul provider di passkey.

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