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 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 này. Đối với các nhà cung cấp khoá truy cập dựa trên tiện ích Chrome, họ có thể chọn phản ánh tín hiệu này hay không.
Chúng tôi sẽ hỗ trợ Chrome trên Android trong thời gian tới.
Safari có 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 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 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 đă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 nào trong số các khoá truy cập đượ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 hơn 2 khoá truy cập từ 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ủ, khoá truy cập sẽ không bị ảnh hưởng trong trình cung cấp khoá truy cập. Lần tới khi 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 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ủ. 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 vẫn 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à chúng nên được đồng bộ hoá.
Signal API
Signal API là một WebAuthn API 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:
PublicKeyCredential.signalUnknownCredential
: Báo hiệu rằng một thông tin đăng nhập không tồn tạiPublicKeyCredential.signalAllAcceptedCredentials
: Báo hiệu danh sách thông tin đăng nhập đã lưuPublicKeyCredential.signalCurrentUserDetails
: Signal cập nhật tên người dùng và/hoặc tên hiển thị
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ẽ 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 đăng nhập được liên kết không tồn tại.
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 một 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 truyền toàn bộ danh sách mã nhận dạng thông tin đăng nhập, 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 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.

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",
...
]
});
}
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 đăng nhập của thông tin đăng nhập đã lưu trữ, RP có thể thông báo cho nhà cung cấp khoá truy cập về thông tin đăng nhập còn lại trong bộ nhớ của mình. Việc xử lý tín hiệu này là tuỳ thuộc vào nhà cung cấp khoá truy cập, nhưng những 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 khoá truy cập khi đăng nhập mà không có thông tin đăng nhập liên kết.
Bạn nên gọi API này khi người dùng xoá một khoá truy cập trên RP và 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ẽ quyết định cách xử lý tín hiệu này, nhưng các 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ật và mỗi khi người dùng đăng nhập, để nhà cung cấp khoá truy cập có thể giữ cho thông tin này được đồng bộ hoá với máy chủ.

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ỏ khả năng xảy ra lỗi đăng nhập không mong muốn. Với Signal API, các bên phụ thuộc có thể 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á 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 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.