支援 FedCM 的自動重新驗證

Chrome 支援 FedCM 的自動重新驗證機制

Federated Credential Management API (FedCM) 是用於隱私權保護身分聯盟的 Web API。使用身分聯盟時,RP (依賴方) 依賴 IdP (識別資訊提供者) 來提供使用者帳戶,而不需要求新的使用者名稱和密碼。

FedCM 可讓瀏覽器瞭解 RP 和 IdP 交換資訊時的狀況。這會通知使用者共用的資訊和權限層級,並防止意外遭到濫用。自 108 版起,Chrome 開始提供 FedCM。

在 Chrome 115 版中,FedCM 將支援自動重新驗證,藉此改善使用者體驗,並在初次同意後以更簡單的方式重新驗證 RP。

自動重新驗證

目前,使用者透過 FedCM API 使用 FedCM API 建立 RP 上的聯合帳戶後,下次造訪該網站時,就必須在使用者介面中完成相同的步驟。這表示使用者必須明確且手動重新確認,才能重新驗證並繼續進行登入流程。

雖然在使用者建立聯合帳戶防止追蹤 (FedCM 的主要目標之一) 之前,明確的使用者體驗才顯得合理,但在使用者完成一次授權後,這是非常麻煩的一點:在使用者授予 RP 和 IdP 之間的通訊權限後,使用者已明確同意執行 RP 與 IdP 之間的通訊,並不會對隱私權或安全性有所助益。因此,我們推出更精簡的使用者體驗,讓 RP 能夠為回訪者選擇更流暢的體驗。

透過 FedCM 自動重新驗證 (簡稱「auto-reauthn」) 可讓使用者在初次使用 FedCM 完成初始驗證後,自動重新驗證。此處的「初始驗證」是指使用者在同一個瀏覽器執行個體上首次輕觸 FedCM 登入對話方塊中的「Continue as...」按鈕,藉此建立帳戶或登入 RP 網站。

使用者輕觸以建立帳戶或驗證的對話方塊。
使用者輕觸這個對話方塊,藉此建立帳戶或進行驗證。

選擇自動重新驗證的選項

雖然我們推出自動重新驗證功能,藉此提供更優質的使用者體驗,並讓應用程式符合規格要求,但預設使用者體驗不會有任何程式碼變更。啟用自動重新驗證後,瀏覽器會根據開發人員在 navigator.credentials.get() 提供的 mediation 選項中選取的選項,變更其行為。

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example/fedcm.json",
      clientId: "1234",
    }],
  },
  mediation: 'optional', // this is the default
});

mediationCredential Management API 中的屬性,其行為相同PasswordCredentialFederatedCredential 的運作方式相同,另外還有PublicKeyCredential 獲得部分支援。此屬性接受下列四個值:

  • 'required':一律要求中介服務才可繼續操作,例如按一下使用者介面上的「繼續」按鈕。如果使用者每次需要進行驗證時,都會明確授予權限,請選擇這個選項。
  • 'optional'(預設):盡可能自動重新驗證;如果不是,則必須提供中介服務。建議您在登入頁面上選擇這個選項。
  • 'silent':如果可能,自動重新驗證;如果沒有,則在不要求中介服務的情況下失敗。建議您在專屬登入頁面以外的其他頁面中選擇此選項,例如運送網站上的商品頁面或新聞網站的文章頁面。
  • 'conditional':用於 WebAuthn,且目前不適用於 FedCM。

在此呼叫中,系統會在下列情況下自動重新驗證:

  • 可以使用 FedCM。例如,使用者尚未全域停用 FedCM,或設定中未針對 RP 停用 FedCM。
  • 使用者只使用一個具備 FedCM API 的帳戶,在這個瀏覽器中登入網站。
  • 使用者已使用該帳戶登入 IdP。
  • 過去 10 分鐘內未執行自動重新驗證。
  • 上次登入後,RP 未呼叫 navigator.credentials.preventSilentAccess()

當符合上述條件時,會嘗試在叫用 FedCM navigator.credentials.get() 後立即自動重新驗證使用者。

透過 FedCM 自動重新驗證的使用者。

使用 preventSilentAccess() 強制執行中介服務

當使用者登出後立即進行自動重新驗證,並不會帶來良好的使用者體驗。這也是為什麼 FedCM 在自動重新驗證後會有一個 10 分鐘的靜止期,以防止這種行為發生。這表示自動重新驗證最多每 10 分鐘最多只會執行一次,除非使用者在 10 分鐘內重新登入。RP 應呼叫 navigator.credentials.preventSilentAccess() 並明確要求瀏覽器在使用者明確登出 RP 時 (例如點選登出按鈕) 停用自動重新驗證。

function signout() {
  navigator.credentials.preventSilentAccess();
  location.href = '/signout';
}

使用者可以在「設定」中停用自動重新驗證

使用者可以透過設定選單選擇不採用自動重新驗證功能:

  • 在電腦版 Chrome 中,依序前往 chrome://password-manager/settings > 自動登入。
  • 在 Android Chrome 中,依序開啟「設定」 >「密碼管理工具」 > 依序輕觸右上角的齒輪 >「自動登入」。

停用切換按鈕之後,使用者就能完全停用自動重新驗證行為。如果使用者已在 Chrome 執行個體上登入 Google 帳戶,且已啟用同步功能,這項設定就會儲存並同步到所有裝置。

提供意見

如果您測試的是 FedCM,可以在 crbug.com 的元件底下,透過 「Blink>Identity>FedCM」提供意見回饋或意見回饋。

Noah Samuel FranzUnsplash 上提供的相片