發布日期:2025 年 5 月 9 日
密碼金鑰採用可防範網路詐騙的驗證機制,不過,要讓使用者採用這些功能可能會遇到阻力。只要使用者已儲存網站密碼,您就能在適當的時機為他們建立密碼金鑰。條件式建立功能可自動建立密碼金鑰,是 WebAuthn 規格的一部分。
運作方式
如要協助使用者更方便地採用密碼金鑰,請使用名為「條件式建立」的 WebAuthn API 功能。條件式建立功能可讓網站為使用者要求密碼金鑰,不需使用者採取任何行動。
如要使用這項流程,必須符合下列條件:
- 使用者在預設密碼管理工具中儲存了密碼。
- 這組密碼最近曾使用過。理想情況下,請在密碼登入成功後立即呼叫 Conditional Create。
如果兩個條件都符合,您可以呼叫「條件式建立」,要求密碼管理工具為使用者建立密碼金鑰。成功建立密碼金鑰後,系統會根據密碼管理工具通知使用者。
相容性
macOS 上的 Safari 和 iOS 上的所有瀏覽器,以及桌機上的 Chrome 和 Android 上的 Chrome,都支援有條件建立功能。
實作條件式建立
自動建立密碼金鑰的功能是以 WebAuthn API 的「條件式建立」功能為基礎。這些是常見的 WebAuthn create()
要求,其中 mediation
參數設為 "conditional"
,運作方式與 get()
要求的密碼金鑰自動填入功能類似。
使用者以密碼登入後,請使用條件式建立。能否成功建立密碼取決於密碼管理工具和是否符合特定條件。這些條件會因密碼管理工具而異,且可能會隨時間變動。舉例來說,在 Chrome 中使用 Google 密碼管理工具 (GPM) 時,使用者必須最近曾使用儲存的網站密碼登入。
如果瀏覽器成功建立密碼金鑰,就會傳回公開金鑰憑證。將這項憑證傳送至後端 ,完成註冊並啟用日後的驗證程序。
特徵偵測
您可以叫用 PublicKeyCredential.getClientCapabilities()
,判斷瀏覽器是否支援條件式建立。查看傳回的物件是否包含 conditionalCreate
屬性的 true
。
if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) {
const capabilities = await PublicKeyCredential.getClientCapabilities();
if (capabilities.conditionalCreate) {
// Conditional create is available
}
}
如果 getClientCapabilities
無法使用,則「有條件建立」也無法使用。
有條件地建立密碼金鑰
如要自動建立密碼金鑰,請叫用 navigator.credentials.create()
,但要使用 mediation: "conditional"
,如下所示。
const cred = await navigator.credentials.create({
publicKey: options,
// Request conditional creation
mediation: 'conditional'
});
使用者登入後,您應立即使用密碼金鑰自動建立功能,盡可能符合密碼管理工具的自動建立條件。
您可以將產生的公開金鑰憑證傳送至伺服器,驗證及註冊密碼金鑰。 在伺服器上,確認使用者已登入。
注意事項
單獨實作條件式建立功能並不困難,但將這項功能整合至現有系統時,有幾項注意事項。
在伺服器上忽略使用者在場狀態和使用者驗證
註冊回應會將「User Presence」和「User Verified」都傳回為 false
,因此伺服器應在憑證驗證期間忽略這些旗標。
在執行自動密碼金鑰建立作業前,中止進行中的 WebAuthn 呼叫
當 RP 預期使用者會使用密碼金鑰或密碼登入時,執行條件式取得是最佳選擇。這可能會導致條件式 GET 呼叫在執行條件式建立作業前取消。
如要這麼做,請使用 AbortController
並呼叫 .abort()
。
// To abort a WebAuthn call, instantiate an AbortController.
const controller = new AbortController();
const cred = await navigator.credentials.get({
publicKey: options,
signal: controller.signal,
// Request conditional get
mediation: 'conditional'
});
// Abort the call
controller.abort();
順利忽略例外狀況
執行有條件的密碼金鑰建立作業時,有幾種情況應忽略例外狀況:
InvalidStateError
:密碼金鑰提供者中已有密碼金鑰 (別忘了指定excludeCredentials
)。NotAllowedError
:建立密碼金鑰不符合條件。AbortError
:WebAuthn 呼叫已中止。
在這些情況下顯示錯誤可能會讓使用者感到困惑,因為瀏覽器會以無訊息的方式處理這些錯誤:只會在成功時顯示通知,失敗時則不會觸發可見訊息。
註冊密碼金鑰失敗時發出信號
如果密碼金鑰已建立,但無法在伺服器上註冊,使用者就會登入失敗。如果密碼金鑰供應商和伺服器上的密碼金鑰清單不一致,就可能會發生這種情況。
為避免發生這種情況,請使用 Signal API 確保兩者一致。
不支援從無密碼登入升級
此時,建立密碼金鑰的條件是使用者必須輸入有效密碼。也就是說,無密碼登入方式 (例如魔法連結、電話號碼驗證或身分同盟) 不符合條件。
摘要
自動建立密碼金鑰可加快網站採用密碼金鑰的速度,協助網站使用者從密碼轉換為更安全的驗證方法。
如要進一步瞭解密碼金鑰,請參閱「使用密碼金鑰登入帳戶」。