Duy trì tính nhất quán giữa khoá truy cập và thông tin xác thực trên máy chủ của bạn bằng Signal API

Ngày xuất bản: 12 tháng 11 năm 2024

WebAuthn Signal API cho phép các bên phụ thuộc báo hiệu thông tin xác thực hiện có cho các nhà cung cấp khoá truy cập đã kết nối. Nhờ đó, nhà cung cấp khoá truy cập hỗ trợ có thể cập nhật hoặc xoá khoá truy cập không chính xác hoặc bị thu hồi khỏi bộ nhớ để không còn cung cấp cho người dùng.

Khả năng tương thích

Chrome trên máy tính hỗ trợ Signal API kể từ Chrome 132. Trình quản lý mật khẩu của Google có thể cập nhật khoá truy cập để phản ánh tín hiệu đó. Đối với các nhà cung cấp khoá truy cập dựa trên tiện ích Chrome, việc phản ánh tín hiệu hay không là tuỳ thuộc vào họ.

Chúng tôi sẽ hỗ trợ Chrome trên Android sau.

Safari hỗ trợ nhưng chưa được triển khai. Firefox chưa chia sẻ ý kiến của họ.

Thông tin khái quát

Khi bạn tạo khoá truy cập (thông tin xác thực có thể phát hiện được), siêu dữ liệu như tên người dùng và tên hiển thị sẽ được lưu vào trình cung cấp khoá truy cập (chẳng hạn như trình quản lý mật khẩu) cùng với khoá riêng tư, trong khi thông tin xác thực khoá công khai sẽ được lưu vào máy chủ của bên phụ thuộc (RP). Việc lưu tên người dùng và tên hiển thị giúp người dùng xác định mã xác thực nào được cung cấp để đăng nhập khi được nhắc. Điều này đặc biệt hữu ích khi họ có nhiều khoá truy cập từ nhiều nhà cung cấp khoá truy cập.

Tuy nhiên, có một số trường hợp sự không nhất quán giữa danh sách khoá truy cập của nhà cung cấp khoá truy cập và danh sách thông tin xác thực của máy chủ có thể gây nhầm lẫn.

Trường hợp đầu tiên là khi người dùng xoá thông tin xác thực trên máy chủ mà không xoá khoá truy cập trong trình cung cấp khoá truy cập. Lần tiếp theo người dùng cố gắng đăng nhập bằng khoá truy cập, khoá truy cập đó vẫn sẽ được trình cung cấp khoá truy cập hiển thị cho người dùng. Tuy nhiên, thao tác đăng nhập sẽ không thành công vì máy chủ sẽ không thể xác minh bằng khoá công khai đã bị xoá.

Trường hợp thứ hai là khi người dùng cập nhật tên người dùng hoặc tên hiển thị trên máy chủ. Lần tiếp theo người dùng cố gắng đăng nhập, khoá truy cập trong trình cung cấp khoá truy cập sẽ tiếp tục hiển thị tên người dùng và tên hiển thị cũ mặc dù đã được cập nhật trên máy chủ. Tốt nhất là các tệp này phải đồng bộ.

Signal API

Signal API là một API WebAuthn giúp giải quyết những nhầm lẫn này bằng cách cho phép RP báo hiệu các thay đổi cho nhà cung cấp khoá truy cập. Có 3 phương thức:

Tín hiệu cho biết thông tin xác thực không tồn tại

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.
    ...
  }
}

Bằng cách gọi PublicKeyCredential.signalUnknownCredential() bằng mã nhận dạng RP và mã nhận dạng thông tin xác thực, RP có thể thông báo cho nhà cung cấp khoá truy cập rằng thông tin xác thực đã chỉ định đã bị xoá hoặc không tồn tại. Trình cung cấp khoá truy cập sẽ quyết định cách xử lý tín hiệu này, nhưng khoá truy cập được liên kết dự kiến sẽ bị xoá để người dùng không đăng nhập bằng khoá truy cập vì thông tin xác thực được liên kết không tồn tại.

Bạn có thể gọi API này khi không đăng nhập được bằng khoá truy cập do thiếu thông tin xác thực. Bằng cách này, RP có thể ngăn người dùng cố gắng đăng nhập bằng một khoá truy cập không có thông tin xác thực được liên kết. Không giống như signalAllAcceptedCredentials, phương thức này không yêu cầu truyền toàn bộ danh sách mã thông tin xác thực, vì vậy, bạn nên sử dụng phương thức này bất cứ khi nào người dùng không được xác thực để tránh tiết lộ số lượng khoá truy cập cho một người dùng nhất định.

Hộp thoại xuất hiện khi khoá truy cập bị xoá khỏi Trình quản lý mật khẩu của Google trên Chrome.
Hộp thoại xuất hiện khi một khoá truy cập bị xoá khỏi Trình quản lý mật khẩu của Google trên Chrome.

Báo hiệu danh sách thông tin xác thực đã lưu

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

Bằng cách gọi PublicKeyCredential.signalAllAcceptedCredentials() bằng mã nhận dạng RP, mã nhận dạng người dùng và danh sách mã nhận dạng thông tin xác thực của thông tin xác thực được lưu trữ, RP có thể thông báo cho nhà cung cấp khoá truy cập về thông tin xác thực còn lại trong bộ nhớ của nó. Trình cung cấp khoá truy cập có thể tuỳ ý xử lý tín hiệu này, nhưng các khoá truy cập không khớp với danh sách này dự kiến sẽ bị xoá để người dùng không thấy các khoá truy cập khi đăng nhập mà không có thông tin xác thực được liên kết.

Bạn nên gọi API này khi người dùng xoá khoá truy cập trên RP và trong mỗi lần đăng nhập để trình cung cấp khoá truy cập có thể giữ danh sách khoá truy cập được đồng bộ hoá.

Signal đã cập nhật tên người dùng và tên hiển thị

// 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 {
}

Bằng cách gọi PublicKeyCredential.signalCurrentUserDetails() bằng mã nhận dạng RP, mã nhận dạng người dùng, tên người dùng và tên hiển thị, RP có thể thông báo cho nhà cung cấp khoá truy cập về thông tin người dùng đã cập nhật. Nhà cung cấp khoá truy cập có thể quyết định cách xử lý tín hiệu này, nhưng khoá truy cập mà người dùng sở hữu dự kiến sẽ được cập nhật bằng thông tin người dùng mới.

Bạn có thể gọi API này khi tên người dùng hoặc tên hiển thị của người dùng được cập nhậtmỗi khi đăng nhập để trình cung cấp khoá truy cập có thể đồng bộ hoá thông tin này với máy chủ.

Hộp thoại xuất hiện khi siêu dữ liệu khoá truy cập được cập nhật trong Trình quản lý mật khẩu của Google trên Chrome.
Hộp thoại hiển thị khi siêu dữ liệu khoá truy cập được cập nhật trong Trình quản lý mật khẩu của Google trên Chrome.

Tóm tắt

Signal API giúp bạn xây dựng trải nghiệm khoá truy cập tốt hơn bằng cách loại bỏ khả năng xảy ra lỗi đăng nhập ngoài dự kiến. Với Signal API, các bên phụ thuộc có thể báo hiệu danh sách thông tin xác thực hiện có và siêu dữ liệu của các thông tin xác thực đó để có thể đồng bộ hoá khoá truy cập trên trình cung cấp khoá truy cập.

Để tìm hiểu thêm về khoá truy cập, hãy bắt đầu từ bài viết Đăng nhập không cần mật khẩu bằng khoá truy cập.