Dipublikasikan: 12 November 2024, Terakhir diperbarui: 29 November 2024
WebAuthn Signal API memungkinkan pihak tepercaya memberikan sinyal kredensial yang ada ke penyedia kunci sandi yang terhubung. Hal ini memungkinkan penyedia kunci sandi pendukung memperbarui atau menghapus kunci sandi yang salah atau dicabut dari penyimpanannya sehingga kunci sandi tersebut tidak lagi ditawarkan kepada pengguna.
Kompatibilitas
Chrome mendukung Signal API di semua platform desktop dan Android.
Safari mendukung tetapi belum diterapkan. Firefox belum menyampaikan pendapatnya.
Pengelola Sandi Google dapat memperbarui kunci sandi untuk mencerminkan sinyal. Penyedia kunci sandi berbasis ekstensi Chrome di desktop memutuskan apakah akan mencerminkan sinyal tersebut.
Latar belakang
Saat kunci sandi (kredensial yang dapat ditemukan) dibuat, metadata seperti nama pengguna dan nama tampilan disimpan ke penyedia kunci sandi (seperti pengelola sandi) bersama dengan kunci pribadi, sementara kredensial kunci publik disimpan ke server pihak tepercaya (RP). Menyimpan nama pengguna dan nama tampilan membantu pengguna mengidentifikasi kunci sandi yang ditawarkan untuk digunakan saat login jika diminta. Hal ini sangat berguna jika pengguna memiliki lebih dari dua kunci sandi dari penyedia kunci sandi yang berbeda.
Namun, ada beberapa kasus ketika inkonsistensi antara daftar kunci sandi penyedia kunci sandi dan daftar kredensial server dapat menyebabkan kebingungan.
Kasus pertama adalah saat pengguna menghapus kredensial di server. Tindakan ini tidak mengubah kunci sandi di penyedia kunci sandi. Saat berikutnya pengguna mencoba login dengan kunci sandi, penyedia kunci sandi akan tetap menampilkan kunci sandi tersebut kepada pengguna. Namun, upaya untuk login akan gagal karena server tidak dapat memverifikasi kunci publik yang dihapus.
Kasus kedua adalah saat pengguna memperbarui nama pengguna atau nama tampilannya di server. Saat pengguna mencoba login lagi, kunci sandi di penyedia kunci sandi akan terus menampilkan nama pengguna dan nama tampilan lama meskipun telah diperbarui di server. Idealnya, keduanya disinkronkan.
Signal API
Signal API adalah WebAuthn API yang menyelesaikan inkonsistensi ini dengan memungkinkan RP memberikan sinyal perubahan kepada penyedia kunci sandi. Ada tiga metode:
PublicKeyCredential.signalUnknownCredential: Memberi sinyal bahwa kredensial tidak adaPublicKeyCredential.signalAllAcceptedCredentials: Memberi sinyal daftar kredensial tersimpanPublicKeyCredential.signalCurrentUserDetails: Nama pengguna dan nama tampilan Signal yang diperbarui
Memberi sinyal bahwa kredensial tidak ada
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.
...
}
}
Dengan memanggil PublicKeyCredential.signalUnknownCredential() dengan ID RP dan ID kredensial, RP dapat memberi tahu penyedia kunci sandi bahwa kredensial yang ditentukan telah dihapus atau tidak ada. Penyedia kunci sandi menentukan cara menangani sinyal ini,
tetapi kunci sandi terkait harus dihapus agar pengguna tidak mencoba login
dengan kunci sandi yang tidak memiliki kredensial terkait.
API ini dapat dipanggil jika login berbasis kunci sandi gagal karena kredensial tidak ada.
Dengan cara ini, RP dapat mencegah pengguna mencoba login dengan kunci sandi yang
tidak memiliki kredensial terkait. Tidak seperti
signalAllAcceptedCredentials, metode ini tidak mengharuskan Anda meneruskan seluruh
daftar ID kredensial, jadi gunakan metode ini setiap kali pengguna tidak diautentikasi untuk menghindari
pengungkapan jumlah kunci sandi untuk pengguna tertentu.
Menandai daftar kredensial tersimpan
// 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",
...
]
});
}
Gunakan PublicKeyCredential.signalAllAcceptedCredentials() setelah pengguna login
atau mengelola setelan akun. Anda memberikan daftar semua ID kredensial yang valid untuk pengguna tersebut. Penyedia kunci sandi membandingkan daftar ini dengan penyimpanan lokalnya untuk pihak tepercaya tersebut. Penyedia kunci sandi menandai sebagai "tersembunyi" kunci sandi apa pun yang ditemukan di penyimpanannya yang tidak disertakan dalam daftar allAcceptedCredentialIds.
Sistem tidak lagi menawarkan kunci sandi tersembunyi ini untuk login atau pengisian otomatis, tetapi kunci sandi tersebut tidak langsung dihapus secara permanen, sehingga memungkinkan pemulihan jika diperlukan.
Sebaliknya, penyedia kunci sandi memulihkan kunci sandi yang ada di allAcceptedCredentialIds yang ditandai sebagai "tersembunyi".
Hal ini memungkinkan situs Anda memulihkan kunci sandi yang tersembunyi karena kesalahan.
Panggil API ini saat pengguna menghapus kunci sandi di RP dan di setiap login, sehingga penyedia kunci sandi dapat mempertahankan daftar kunci sandi yang disinkronkan.
Sinyal memperbarui nama pengguna dan nama tampilan
// 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 {
}
Dengan memanggil PublicKeyCredential.signalCurrentUserDetails() dengan ID RP, ID pengguna, nama pengguna, dan nama tampilan, RP dapat memberi tahu penyedia kunci sandi tentang informasi pengguna yang diperbarui. Penyedia kunci sandi menentukan cara menangani sinyal ini,
tetapi penyedia harus memperbarui kunci sandi yang dimiliki pengguna dengan informasi pengguna baru.
API ini dapat dipanggil saat nama pengguna atau nama tampilan pengguna diperbarui, dan pada setiap login, sehingga penyedia kunci sandi dapat menyinkronkan informasi ini dengan server.
Ringkasan
Signal API membantu Anda membangun pengalaman kunci sandi yang lebih baik dengan menghilangkan kegagalan login yang tidak terduga. Signal API memungkinkan pihak tepercaya memberikan sinyal daftar kredensial yang ada dan metadatanya, sehingga mereka dapat menyinkronkan kunci sandi di penyedia kunci sandi.
Untuk mempelajari lebih lanjut kunci sandi, lihat Login tanpa sandi dengan kunci sandi.