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

Xuất bản: ngày 12 tháng 11 năm 2024, Cập nhật lần gần đây nhất: ngày 29 tháng 11 năm 2024

WebAuthn Signal API cho phép các bên phụ thuộc chuyển 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ờ đó, một nhà cung cấp khoá truy cập hỗ trợ có thể cập nhật hoặc xoá các khoá truy cập không chính xác hoặc bị thu hồi khỏi bộ nhớ để người dùng không nhận được những khoá truy cập đó nữa.

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

Chrome hỗ trợ Signal API trên mọi nền tảng máy tính và Android.

Safari có hỗ trợ nhưng chưa triển khai. Firefox chưa đưa ra ý kiến của mình.

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. Các trình cung cấp khoá truy cập dựa trên tiện ích Chrome trên máy tính sẽ quyết định có phản ánh tín hiệu hay không.

Thông tin khái quát

Khi một khoá truy cập (một thông tin đăng nhập có thể phát hiện) được tạo, siêu dữ liệu như tên người dùng và tên hiển thị sẽ được lưu vào 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 đăng nhập khoá công khai sẽ được lưu vào máy chủ của bên đáng tin cậy (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 khoá truy cập được cung cấp để sử dụng cho việc đăng nhập khi được nhắc. Điều này đặc biệt hữu ích khi người dùng có nhiều hơn 2 khoá truy cập của các nhà cung cấp khoá truy cập khác nhau.

Tuy nhiên, có một số trường hợp mà 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 đăng nhập 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á một thông tin đăng nhập trên máy chủ. Thao tác này sẽ không ảnh hưởng đến 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, nhà cung cấp khoá truy cập vẫn sẽ cung cấp khoá truy cập đó cho người dùng. Tuy nhiên, lần đăng nhập sẽ không thành công vì máy chủ không xác minh được 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ủ. Vào 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à bạn nên đồng bộ hoá những thông tin này.

Signal API

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

Báo hiệu rằng thông tin đăng nhập 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 đăng nhập, RP có thể thông báo cho nhà cung cấp khoá truy cập rằng thông tin đăng nhập được chỉ định đã bị xoá hoặc không tồn tại. Nhà cung cấp khoá truy cập sẽ xác định cách xử lý tín hiệu này, nhưng bạn nên xoá khoá truy cập được liên kết để người dùng không cố gắng đăng nhập bằng khoá truy cập không có thông tin đăng nhập được liên kết.

Browser Support

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

Source

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

Một 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.
Một hộp thoại xuất hiện khi bạn xoá khoá truy cập 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 đăng nhập đã 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",
      ...
    ]
  });
}

Sử dụng PublicKeyCredential.signalAllAcceptedCredentials() sau khi người dùng đăng nhập hoặc quản lý chế độ cài đặt tài khoản. Bạn cung cấp danh sách tất cả mã nhận dạng thông tin đăng nhập hợp lệ cho người dùng đó. Nhà cung cấp khoá truy cập sẽ so sánh danh sách này với bộ nhớ cục bộ của bên thứ ba đó. Nhà cung cấp khoá truy cập sẽ đánh dấu là "ẩn" mọi khoá truy cập tìm thấy trong bộ nhớ của mình mà không có trong danh sách allAcceptedCredentialIds. Hệ thống sẽ không còn cung cấp những khoá truy cập ẩn này để đăng nhập hoặc tự động điền, nhưng chúng sẽ không bị xoá vĩnh viễn ngay lập tức. Điều này cho phép khôi phục nếu cần. Ngược lại, nhà cung cấp khoá truy cập sẽ khôi phục các khoá truy cập có trong allAcceptedCredentialIds và được đánh dấu là "đã ẩn". Điều này cho phép trang web của bạn khôi phục những khoá truy cập bị ẩn do nhầm lẫn.

Browser Support

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

Source

Gọi API này khi người dùng xoá một khoá truy cập trên RP và trên mỗi lần đăng nhập, để trình cung cấp khoá truy cập có thể duy trì 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 sẽ xác định cách xử lý tín hiệu này, nhưng cần cập nhật khoá truy cập mà người dùng sở hữu bằng thông tin người dùng mới.

Browser Support

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

Source

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 lần đăng nhập, để nhà cung cấp khoá truy cập có thể duy trì thông tin này được đồng bộ hoá với máy chủ.

Một 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 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.

Tóm tắt

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

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