Pastikan kunci sandi konsisten dengan kredensial di server Anda dengan Signal API

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:

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.

Dialog yang ditampilkan saat kunci sandi dihapus dari Pengelola Sandi Google di Chrome.
Dialog yang ditampilkan saat kunci sandi dihapus dari Pengelola Sandi Google di Chrome.

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.

Dialog yang ditampilkan saat metadata kunci sandi diperbarui di Pengelola Sandi Google di Chrome.
Dialog yang ditampilkan saat metadata kunci sandi diperbarui di Pengelola Sandi Google di Chrome.

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.