Pemeriksaan Deteksi Fitur Credential Management API

Ringkasan

WebAuthn membantu meningkatkan keamanan dengan menghadirkan autentikasi berbasis kredensial kunci publik ke Web, dan akan segera didukung di Chrome, Firefox, dan Edge (dengan spesifikasi terbaru). Namun, metode ini menambahkan jenis objek Credential baru, yang, tetapi dapat merusak situs yang menggunakan Credential Management API tanpa mendeteksi fitur jenis kredensial tertentu yang mereka gunakan.

Jika saat ini Anda melakukannya untuk deteksi fitur

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // use CM API
}

Lakukan ini sebagai gantinya

if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

Lihat perubahan yang dibuat pada kode contoh sebagai contoh.

Baca terus untuk mempelajari lebih lanjut.

Apa itu Credential Management API

Credential Management API (CM API) memberi situs akses terprogram ke penyimpanan kredensial agen pengguna untuk menyimpan/mengambil kredensial pengguna untuk asal panggilan.

API dasar adalah:

  • navigator.credentials.get()
  • navigator.credentials.store()
  • navigator.credentials.create()
  • navigator.credentials.preventSilentAccess()

Spesifikasi CM API asli menentukan 2 jenis kredensial:

  • PasswordCredential
  • FederatedCredential

PasswordCredential adalah kredensial yang berisi ID dan sandi pengguna. FederatedCredential adalah kredensial yang berisi ID pengguna dan string yang mewakili penyedia identitas.

Dengan 2 kredensial ini, situs dapat:

  • Mengizinkan pengguna login dengan kredensial berbasis sandi atau kredensial gabungan yang disimpan sebelumnya segera setelah mereka membuka (login otomatis),
  • Simpan kredensial berbasis sandi atau kredensial gabungan yang digunakan pengguna untuk login,
  • Selalu perbarui kredensial login pengguna (misalnya, setelah sandi diubah)

Apa itu WebAuthn

WebAuthn (Autentikasi Web) menambahkan kredensial kunci publik ke CM API. Misalnya, platform ini memberikan cara standar pada situs untuk menerapkan autentikasi faktor kedua menggunakan perangkat pengautentikasi yang kompatibel dengan FIDO 2.0.

Di tingkat teknis, WebAuthn memperluas CM API dengan antarmuka PublicKeyCredential.

Apa permasalahannya?

Sebelumnya, kami telah memandu developer untuk mendeteksi fitur CM API dengan kode berikut:

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
  // Use CM API
}

But as you can see from the descriptions above, the `navigator.credentials` is
now expanded to support public-key credentials in addition to password
credentials and federated credentials.

The problem is that user agents don't necessarily support all kinds of
credentials. If you continue feature detect using `navigator.credentials`, your
website may break when you are using a certain credential type not supported by
the browser.

**Supported credential types by browsers**
<table class="properties with-heading-tint"><tbody><tr>
<th></th>
<th>PasswordCredential / FederatedCredential</th>
<th>PublicKeyCredential</th>
</tr><tr><th>Chrome
</th><td>Available
</td><td>In development
</td></tr><tr><th>Firefox
</th><td>N/A
</td><td>Aiming to ship on 60
</td></tr><tr><th>Edge
</th><td>N/A
</td><td>Implemented with <a href="https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/">older API</a>. New API (navigator.credentials) coming soon.
</td></tr></tbody></table>


## The solution
You can avoid this by modifying feature detection code as follows to explicitly
test for the credential type that you intend to use.

```js
if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

Lihat perubahan sebenarnya yang dibuat pada kode contoh sebagai contoh.

Sebagai referensi, berikut cara mendeteksi PublicKeyCredential yang ditambahkan di WebAuthn:

if (window.PublicKeyCredential) {
    // use CM API with PublicKeyCredential added in the WebAuthn spec
}

Rentang waktu

Implementasi WebAuthn paling awal yang tersedia adalah Firefox dan direncanakan stabil pada awal Mei 2018.

Terakhir

Jika ada pertanyaan, kirimkan ke @agektmr atau agektmr@chromium.org.