Web Authentication API

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2019.

* Some parts of this feature may have varying levels of support.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

Web Authentication API (WebAuthn) là một phần mở rộng của Credential Management API cho phép xác thực mạnh mẽ với mật mã khóa công khai, không cần mật khẩu.

WebAuthn cho phép máy chủ đăng ký và xác thực người dùng bằng mật mã khóa công khai thay vì mật khẩu. Điều này giúp giải quyết nhiều vấn đề bảo mật liên quan đến mật khẩu như rò rỉ dữ liệu, tấn công phishing và tấn công replay.

Khái niệm và cách sử dụng

WebAuthn sử dụng mật mã bất đối xứng (khóa công khai/khóa riêng tư) để tạo và xác thực thông tin xác thực, và giảm thiểu các mối đe dọa bảo mật như lừa đảo và rò rỉ dữ liệu.

Đăng ký (Registration)

Khi người dùng đăng ký bằng WebAuthn:

  1. Máy chủ tạo một thách thức ngẫu nhiên.
  2. Thiết bị của người dùng (thiết bị xác thực) tạo một cặp khóa mới.
  3. Khóa riêng tư được lưu trữ an toàn trên thiết bị.
  4. Khóa công khai được gửi đến máy chủ cùng với metadata.

Xác thực (Authentication)

Khi người dùng đăng nhập:

  1. Máy chủ gửi thách thức.
  2. Thiết bị ký thách thức bằng khóa riêng tư.
  3. Máy chủ xác minh chữ ký bằng khóa công khai đã lưu.

Phương thức

WebAuthn bổ sung các phương thức sau vào CredentialsContainer:

create() với PublicKeyCredentialCreationOptions

Đăng ký thông tin xác thực mới:

js
const credential = await navigator.credentials.create({
  publicKey: {
    challenge: new Uint8Array([
      /* thách thức ngẫu nhiên từ máy chủ */
    ]),
    rp: {
      name: "Example Corp",
      id: "example.com",
    },
    user: {
      id: new Uint8Array([
        /* ID người dùng */
      ]),
      name: "user@example.com",
      displayName: "User Name",
    },
    pubKeyCredParams: [
      { alg: -7, type: "public-key" }, // ES256
      { alg: -257, type: "public-key" }, // RS256
    ],
    timeout: 60000,
    attestation: "none",
  },
});

get() với PublicKeyCredentialRequestOptions

Xác thực bằng thông tin xác thực hiện có:

js
const assertion = await navigator.credentials.get({
  publicKey: {
    challenge: new Uint8Array([
      /* thách thức ngẫu nhiên từ máy chủ */
    ]),
    rpId: "example.com",
    allowCredentials: [
      {
        id: credentialId, // ID thông tin xác thực đã đăng ký
        type: "public-key",
        transports: ["usb", "ble", "nfc", "internal"],
      },
    ],
    timeout: 60000,
  },
});

Giao diện

PublicKeyCredential

Đại diện cho thông tin xác thực, là cặp khóa công khai/khóa riêng tư được tạo khi người dùng đăng ký trên WebAuthn-enabled service.

AuthenticatorResponse

Lớp cơ sở cho các phản hồi thiết bị xác thực.

AuthenticatorAttestationResponse

Phản hồi từ thiết bị xác thực khi tạo thông tin xác thực mới.

AuthenticatorAssertionResponse

Phản hồi từ thiết bị xác thực khi xác thực.

Thông số kỹ thuật

Specification
Web Authentication: An API for accessing Public Key Credentials - Level 3

Tương thích trình duyệt

Xem thêm