協助使用者更順利地採用密碼金鑰

發布日期:2025 年 5 月 9 日

密碼金鑰採用可防範網路詐騙的驗證機制,不過,要讓使用者採用這些功能可能會遇到阻力。只要使用者已儲存網站密碼,您就能在適當的時機為他們建立密碼金鑰。條件式建立功能可自動建立密碼金鑰,是 WebAuthn 規格的一部分。

運作方式

如要協助使用者更方便地採用密碼金鑰,請使用名為「條件式建立」的 WebAuthn API 功能。條件式建立功能可讓網站為使用者要求密碼金鑰,不需使用者採取任何行動。

如要使用這項流程,必須符合下列條件:

  • 使用者在預設密碼管理工具中儲存了密碼。
  • 這組密碼最近曾使用過。理想情況下,請在密碼登入成功後立即呼叫 Conditional Create。

如果兩個條件都符合,您可以呼叫「條件式建立」,要求密碼管理工具為使用者建立密碼金鑰。成功建立密碼金鑰後,系統會根據密碼管理工具通知使用者。

密碼金鑰要求流程 (附條件建立)。

相容性

macOS 上的 Safari 和 iOS 上的所有瀏覽器,以及桌機上的 ChromeAndroid 上的 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 確保兩者一致

不支援從無密碼登入升級

此時,建立密碼金鑰的條件是使用者必須輸入有效密碼。也就是說,無密碼登入方式 (例如魔法連結、電話號碼驗證或身分同盟) 不符合條件。

摘要

自動建立密碼金鑰可加快網站採用密碼金鑰的速度,協助網站使用者從密碼轉換為更安全的驗證方法。

如要進一步瞭解密碼金鑰,請參閱「使用密碼金鑰登入帳戶」。