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

Dipublikasikan: 12 November 2024, Terakhir diperbarui: 29 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 kunci sandi tersebut 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 tersebut. Untuk penyedia kunci sandi berbasis ekstensi Chrome, mereka yang akan menentukan apakah mereka akan mencerminkan sinyal tersebut 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, sementara 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 ketika ketidaksesuaian antara daftar kunci sandi penyedia kunci sandi dan daftar kredensial server dapat menyebabkan kebingungan.

Kasus pertama adalah saat pengguna menghapus kredensial di server sehingga kunci sandi di penyedia kunci sandi tidak terpengaruh. Saat pengguna mencoba login dengan kunci sandi pada waktu berikutnya, kunci sandi tersebut akan tetap ditampilkan kepada pengguna oleh penyedia kunci sandi. Namun, upaya untuk login akan gagal karena server tidak dapat melakukan verifikasi 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 sudah diperbarui di server. Idealnya, keduanya harus disinkronkan.

Signal API

Signal API adalah WebAuthn API yang menyelesaikan kebingungan ini dengan memungkinkan RP untuk memberikan 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 menangani sinyal ini, tetapi kunci sandi terkait diharapkan dihapus sehingga pengguna tidak akan login dengan kunci sandi karena kredensial terkait tidak ada.

Browser Support

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

Source

API ini dapat dipanggil jika 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 memerlukan 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.

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

Dengan memanggil PublicKeyCredential.signalAllAcceptedCredentials() menggunakan ID RP, ID pengguna, dan daftar ID kredensial dari kredensial tersimpan, RP dapat memberi tahu penyedia kunci sandi tentang kredensial yang tersisa di penyimpanannya. Penyedia kunci sandi yang akan 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.

Browser Support

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

Source

API ini harus dipanggil saat pengguna menghapus kunci sandi di RP dan di 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() menggunakan ID RP, ID pengguna, nama pengguna, dan nama tampilan, RP dapat memberi tahu penyedia kunci sandi tentang informasi pengguna yang diperbarui. Penyedia kunci sandi yang akan menentukan cara menangani sinyal ini, tetapi kunci sandi yang dimiliki pengguna diharapkan diperbarui dengan informasi pengguna baru.

Browser Support

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

Source

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.

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 membangun pengalaman kunci sandi yang lebih baik dengan menghilangkan peluang kegagalan login yang tidak terduga. Dengan Signal API, pihak tepercaya dapat memberikan sinyal daftar kredensial yang ada dan metadatanya, sehingga mereka dapat menjaga kunci sandi di penyedia kunci sandi tetap sinkron.

Untuk mempelajari kunci sandi lebih lanjut, mulai dari artikel Login tanpa sandi dengan kunci sandi.