Dipublikasikan: 12 November 2024
WebAuthn Signal API memungkinkan pihak tepercaya untuk memberikan sinyal kredensial yang ada ke penyedia kunci sandi yang terhubung. Dengan demikian, penyedia kunci sandi pendukung dapat memperbarui atau menghapus kunci sandi yang salah atau dicabut dari penyimpanannya sehingga tidak lagi ditawarkan kepada pengguna.
Kompatibilitas
Chrome di desktop mendukung Signal API mulai dari Chrome 132. Pengelola Sandi Google dapat memperbarui kunci sandi yang mencerminkan sinyal. Untuk penyedia kunci sandi berbasis ekstensi Chrome, penyedia tersebut dapat memilih untuk mencerminkan sinyal atau tidak.
Dukungan Chrome di Android akan hadir nanti.
Safari mendukung, tetapi belum diterapkan. Firefox belum membagikan pendapatnya.
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, sedangkan kredensial kunci publik disimpan ke server pihak tepercaya (RP). Menyimpan nama pengguna dan nama tampilan membantu pengguna mengidentifikasi kunci sandi yang ditawarkan untuk login saat diminta. Hal ini sangat berguna jika pengguna memiliki lebih dari dua kunci sandi dari penyedia kunci sandi yang berbeda.
Namun, ada beberapa kasus saat ketidakkonsistenan antara daftar kunci kunci penyedia dan daftar kredensial server dapat menyebabkan kebingungan.
Kasus pertama adalah saat pengguna menghapus kredensial di server sehingga kunci sandi di penyedia kunci sandi tidak tersentuh. Saat berikutnya pengguna mencoba login dengan kunci sandi, kunci sandi tersebut akan tetap ditampilkan kepada pengguna oleh penyedia kunci sandi. Namun, upaya login akan gagal karena server tidak akan dapat memverifikasi dengan kunci publik yang telah dihapus.
Kasus kedua adalah saat pengguna memperbarui nama pengguna atau nama tampilan di server. Saat pengguna mencoba login lagi, kunci sandi di penyedia kunci sandi akan terus menampilkan nama pengguna dan nama tampilan lama meskipun diperbarui di server. Idealnya, keduanya harus sinkron.
Signal API
Signal API adalah WebAuthn API yang menyelesaikan kebingungan ini dengan mengizinkan RP memberi sinyal perubahan kepada penyedia kunci sandi. Ada tiga metode:
PublicKeyCredential.signalUnknownCredential
: Sinyal bahwa kredensial tidak adaPublicKeyCredential.signalAllAcceptedCredentials
: Memberi sinyal daftar kredensial tersimpanPublicKeyCredential.signalCurrentUserDetails
: Signal memperbarui nama pengguna dan/atau nama tampilan
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
yang akan menentukan cara menangani sinyal ini, tetapi kunci sandi terkait diharapkan
akan dihapus sehingga pengguna tidak akan login dengan kunci sandi karena kredensial
terkait tidak ada.
API ini dapat dipanggil saat login berbasis kunci sandi gagal karena
tidak adanya kredensial. Dengan cara ini, RP dapat mencegah pengguna mencoba
login dengan kunci sandi yang tidak memiliki kredensial terkait. Tidak seperti
signalAllAcceptedCredentials
, metode ini tidak mengharuskan penerusan seluruh
daftar ID kredensial, sehingga harus digunakan setiap kali pengguna tidak
diautentikasi untuk menghindari pengungkapan jumlah kunci sandi untuk pengguna tertentu.
Memberi sinyal 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",
...
]
});
}
Dengan memanggil PublicKeyCredential.signalAllAcceptedCredentials()
dengan ID RP,
ID pengguna, dan daftar ID kredensial kredensial yang disimpan, RP dapat memberi tahu
penyedia kunci sandi tentang kredensial yang tersisa di penyimpanannya. Penyedia kunci sandi
yang akan menentukan cara menangani sinyal ini, tetapi kunci sandi yang tidak
cocok dengan daftar ini diharapkan akan dihapus sehingga pengguna tidak akan melihat kunci sandi
saat login yang kredensial terkaitnya tidak ada.
API ini harus dipanggil saat pengguna menghapus kunci sandi di RP dan pada setiap login, sehingga penyedia kunci sandi dapat menyimpan 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. Cara menangani
sinyal ini bergantung pada penyedia kunci sandi, tetapi kunci sandi yang dimiliki pengguna diharapkan akan diperbarui dengan
informasi pengguna baru.
API ini dapat dipanggil saat nama pengguna atau nama tampilan diperbarui, dan pada setiap login, sehingga penyedia kunci sandi dapat membuat informasi ini tetap disinkronkan dengan server.
Ringkasan
Signal API membantu Anda membuat pengalaman kunci sandi yang lebih baik dengan menghilangkan kemungkinan kegagalan login yang tidak terduga. Dengan Signal API, pihak tepercaya dapat memberi sinyal daftar kredensial yang ada dan metadatanya, sehingga mereka dapat terus menyinkronkan kunci sandi di penyedia kunci sandi.
Untuk mempelajari kunci sandi lebih lanjut, mulai dari Login tanpa sandi dengan kunci sandi.