PublicKeyCredential: signalAllAcceptedCredentials() 靜態方法
PublicKeyCredential 介面的 signalAllAcceptedCredentials() 靜態方法會向認證器發出訊號,告知它依賴方(RP)伺服器仍然為特定使用者持有的所有有效的憑據 ID。
這允許認證器更新憑據資訊,刪除 RP 不再識別的所有憑據,例如已刪除帳戶的憑據。每次使用者使用 RP 進行身份驗證時都應呼叫此方法。
signalAllAcceptedCredentials() 只能在當前使用者已透過身份驗證時呼叫——在註冊或登入之後,或在使用者刪除憑據時呼叫,因為它會暴露屬於使用者的敏感資訊。
語法
signalAllAcceptedCredentials(options)
引數
返回值
異常
Promise 會因以下異常而拒絕
SecurityErrorDOMException-
RP 域無效。
TypeErrorDOMException-
userId或allAcceptedCredentialIds中的任何元素不是有效的 base64url 編碼字串。
描述
使用者認證器中儲存的關於可發現憑據(例如,passkey)的資訊可能會與伺服器不同步。當用戶在 RP Web 應用中刪除憑據而未更新認證器時,通常會發生這種情況。
當用戶嘗試使用可發現憑據登入時,他們會看到認證器提供的一組憑據供選擇,然後所選憑據會返回給 RP Web 應用以進行登入。如果使用者選擇了一個已從 RP 伺服器刪除的憑據,該憑據將不會被識別,登入將失敗。這會給使用者帶來困惑,因為他們期望只會看到應該成功的憑據。
為了緩解此問題,RP Web 應用應在使用者刪除憑據或每次使用者登入時呼叫 signalAllAcceptedCredentials(),以告知認證器哪些憑據對給定使用者仍然有效。認證器如何處理此資訊由其自行決定,但預期它會同步其資訊與提供的憑據列表。未出現在列表中的憑據應被刪除,以便使用者不會看到登入 UI 中不存在的憑據。
警告:呼叫 signalAllAcceptedCredentials() 時要謹慎——列表中未包含的任何有效憑據都將從認證器中刪除,這將阻止使用者使用它們進行登入。傳遞空列表可能會刪除使用者的所有憑據。某些認證器可能支援通過後續呼叫 signalAllAcceptedCredentials() 來恢復憑據,並將先前刪除的憑據 ID 包含在列表中。
signalAllAcceptedCredentials() 只能在當前使用者已透過身份驗證時呼叫,因為它會暴露屬於使用者的敏感資訊。如果使用者因嘗試使用 RP 伺服器上不存在的憑據登入而未透過身份驗證,則應改用 unrecognized 憑據呼叫 PublicKeyCredential.signalUnknownCredential(),以便認證器可以刪除它。有關更詳細的比較,請參閱 可發現憑據同步方法。
示例
信令已接受的憑據
在此示例中,我們呼叫 signalAllAcceptedCredentials() 方法,並將使用者擁有的所有憑據(包括他們剛剛登入的憑據)的詳細資訊傳遞給它。因此,認證器應該更新其自身的憑據副本,以便與 RP 保持同步。
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",
// …
],
});
}
有關更多程式碼示例,請參閱 developer.chrome.com 上的 使用 Signal API 使 passkey 與伺服器上的憑據保持一致 (2024)。
規範
| 規範 |
|---|
| Web Authentication:訪問公鑰憑證的 API - 第 3 級 # dom-publickeycredential-signalallacceptedcredentials |
瀏覽器相容性
載入中…
另見
PublicKeyCredential.signalCurrentUserDetails()PublicKeyCredential.signalUnknownCredential()- 使用 Signal API 使 passkey 與伺服器上的憑據保持一致,來自 developer.chrome.com (2024)