摘要
WebAuthn 可在網路上提供以公鑰憑證為基礎的驗證機制,進而提升安全性,不久後 Chrome、Firefox 和 Edge 也將支援這項功能 (搭配更新的規格)。它會新增一種 Credential
物件,但如果使用 Credential Management API 的網站未偵測到所使用的特定憑證類型,可能會導致網站發生問題。
如果您目前是為了偵測功能而執行此操作
if (navigator.credentials && navigator.credentials.preventSilentAccess) {
// use CM API
}
請改用下列做法
if (window.PasswordCredential || window.FederatedCredential) {
// Call navigator.credentials.get() to retrieve stored
// PasswordCredentials or FederatedCredentials.
}
if (window.PasswordCredential) {
// Get/Store PasswordCredential
}
if (window.FederatedCredential) {
// Get/Store FederatedCredential
}
if (navigator.credentials && navigator.credentials.preventSilentAccess) {
// Call navigator.credentials.preventSilentAccess()
}
請參閱範例程式碼的變更。
請繼續閱讀以瞭解詳情!
什麼是憑證管理 API
憑證管理 API (CM API) 可讓網站以程式輔助方式存取使用者代理程式憑證儲存庫,用於儲存/擷取呼叫來源的使用者憑證。
基本 API 包括:
navigator.credentials.get()
navigator.credentials.store()
navigator.credentials.create()
navigator.credentials.preventSilentAccess()
原始的 CM API 規格定義了 2 種憑證類型:
PasswordCredential
FederatedCredential
PasswordCredential
是包含使用者 ID 和密碼的憑證。FederatedCredential
是憑證,其中包含使用者 ID 和代表身分識別提供者的字串。
有了這 2 組憑證,網站就能:
- 讓使用者在登入時立即使用先前儲存的密碼或聯合憑證登入 (自動登入),
- 儲存使用者登入時所用的密碼或聯合式憑證。
- 讓使用者的登入憑證保持在最新狀態 (例如在使用者變更密碼後)
什麼是 WebAuthn
WebAuthn (網頁驗證) 會將公開金鑰憑證新增至 CM API。舉例來說,這項標準可讓網站使用符合 FIDO 2.0 規範的驗證機制裝置,以標準化方式實作雙重驗證。
在技術層面上,WebAuthn 會使用 PublicKeyCredential
介面擴充 CM API。
問題為何?
先前,我們會引導開發人員使用下列程式碼偵測 CM API 功能:
if (navigator.credentials && navigator.credentials.preventSilentAccess) {
// Use CM API
}
But as you can see from the descriptions above, the `navigator.credentials` is
now expanded to support public-key credentials in addition to password
credentials and federated credentials.
The problem is that user agents don't necessarily support all kinds of
credentials. If you continue feature detect using `navigator.credentials`, your
website may break when you are using a certain credential type not supported by
the browser.
**Supported credential types by browsers**
<table class="properties with-heading-tint"><tbody><tr>
<th></th>
<th>PasswordCredential / FederatedCredential</th>
<th>PublicKeyCredential</th>
</tr><tr><th>Chrome
</th><td>Available
</td><td>In development
</td></tr><tr><th>Firefox
</th><td>N/A
</td><td>Aiming to ship on 60
</td></tr><tr><th>Edge
</th><td>N/A
</td><td>Implemented with <a href="https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/">older API</a>. New API (navigator.credentials) coming soon.
</td></tr></tbody></table>
## The solution
You can avoid this by modifying feature detection code as follows to explicitly
test for the credential type that you intend to use.
```js
if (window.PasswordCredential || window.FederatedCredential) {
// Call navigator.credentials.get() to retrieve stored
// PasswordCredentials or FederatedCredentials.
}
if (window.PasswordCredential) {
// Get/Store PasswordCredential
}
if (window.FederatedCredential) {
// Get/Store FederatedCredential
}
if (navigator.credentials && navigator.credentials.preventSilentAccess) {
// Call navigator.credentials.preventSilentAccess()
}
請參閱對程式碼範例所做的實際變更。
以下是如何偵測 WebAuthn 中新增的 PublicKeyCredential
,供您參考:
if (window.PublicKeyCredential) {
// use CM API with PublicKeyCredential added in the WebAuthn spec
}
時間軸
WebAuthn 最早可在 Firefox 實作,預計在 2018 年 5 月初穩定運作。
最終結果
如有任何疑問,請傳送至 @agektmr 或 agektmr@chromium.org。