使用 WebOTP API 在跨來源 iframe 中填入動態密碼表單

WebOTP API 現在可以從 iframe 中接收動態密碼。

簡訊動態密碼 (動態密碼) 常用於驗證電話號碼, 做為驗證流程的第二個步驟,或用來驗證網路上的付款。 不過,在瀏覽器和簡訊應用程式之間切換,就能複製貼上或手動複製 輸入動態密碼,就能輕鬆輸入錯誤,也會造成使用者體驗上的阻礙。

WebOTP API 可讓網站透過程式 取得簡訊中的動態密碼並輸入 使用者只要輕觸一下,就能自動填入表單 應用程式。簡訊具有特殊格式,並且會繫結至來源,因此可緩解 也讓網路釣魚網站竊取動態密碼

WebOTP 尚未支援的其中一項用途是指定來源 在 iframe 內顯示通常用於確認付款,特別是 採用 3D Secure 即可。具有共通點的 支援跨來源格式 iframes,WebOTP API 現在會提供 自 Chrome 91 版起,繫結至巢狀來源的 OTP。

WebOTP API 的運作方式

WebOTP API 本身就夠簡單:

…
  const otp = await navigator.credentials.get({
    otp: { transport:['sms'] }
  });
…

簡訊必須採用來源限制的一次性格式 代碼

Your OTP is: 123456.

@web-otp.glitch.me #12345

請注意,在最後一行包含要與前面加上 @,後面加上 # 開頭的動態密碼。

收到簡訊時,系統會彈出資訊列,提示使用者 驗證電話號碼。使用者按下 Verify 按鈕後, 瀏覽器會自動將動態密碼轉達給該網站並解析 navigator.credentials.get()。接著網站就能擷取動態密碼,並填妥 進行驗證

如要瞭解 WebOTP 的基本使用方法,請參閱「使用 WebOTP API

跨來源 iframe 用途

經常在付款時在跨來源 iframe 中輸入動態密碼 情境部分信用卡發卡機構會要求你進行額外的驗證步驟, 確認付款人真實性。這項機制稱為 3D Secure,其格式為 通常會在相同網頁的 iframe 內顯示, 付款流程。

例如:

  • 使用者前往 shop.example 購買了一雙信用卡鞋。
  • 輸入信用卡號碼後,整合付款服務供應商會顯示 表單內顯示 bank.example 的表單,要求使用者驗證身分 電話號碼,快速結帳。
  • bank.example」會傳送含有動態密碼的簡訊給使用者, 輸入 PIN 碼,藉此驗證身分。

如何透過跨來源 iframe 使用 WebOTP API

如要從跨來源 iframe 中使用 WebOTP API,您必須完成兩個步驟 事物:

  • 在簡訊文字中同時註解頂端頁框和 iframe 來源 撰寫新的電子郵件訊息
  • 設定權限政策,允許跨來源 iframe 接收動態密碼 直接從使用者登入
,瞭解如何調查及移除這項存取權。
實際操作 iframe 中的 WebOTP API。

你可以自行前往 https://web-otp-iframe-demo.stackblitz.io.

在簡訊中為繫結來源加上註解

從 iframe 內呼叫 WebOTP API 時,簡訊必須 包含頂層頁框起點 (在 @ 開頭,後面加上 # 緊接在 iframe 來源之前的 @ 後方。

@shop.example #123456 @bank.exmple

設定權限政策

如要在跨來源 iframe 中使用 WebOTP,嵌入器必須授予存取權 透過 otp 憑證權限政策設定 API,避免發生非預期的情況 行為一般來說,您可以透過兩種方式達成這個目標:

  • 透過 HTTP 標頭:
Permissions-Policy: otp-credentials=(self "https://bank.example")
  • 透過 iframe allow 屬性:
<iframe src="https://bank.example/…" allow="otp-credentials"></iframe>

查看更多指定權限政策的範例

注意事項

巢狀層級

目前 Chrome 僅支援來自跨來源 iframe 的 WebOTP API 呼叫 其祖系鏈結中「最多」有一個不重複的起點。在 下列情況:

  • a.com ->b.com
  • a.com ->b.com ->b.com
  • a.com ->a.com ->b.com
  • a.com ->b.com ->c.com

可以在 b.com 中使用 WebOTP,但不支援在 c.com 中使用。

請注意,由於缺乏需求,系統也無法支援以下情況 和使用者體驗的複雜程度

  • a.com ->b.com ->a.com (呼叫 WebOTP API)

互通性

雖然 Chromium 以外的瀏覽器引擎並未實作 WebOTP API, Safari 採用相同的簡訊格式 以及 input[autocomplete="one-time-code"] 支援。在 Safari 中, 如果簡訊含有來源端的一次性代碼格式,則會收到與相符 鍵盤會建議在輸入欄位中輸入動態密碼。

自 2021 年 4 月起,Safari 支援使用專屬簡訊格式的 iframe %。 不過,正如本規格討論最後與 @ 的討論,我們希望這些結果 這次支援的簡訊格式會交集。

意見回饋

你的寶貴意見對提升 WebOTP API 品質至關重要,現在就試試看吧! 並告訴我們

資源

rupixen.comUnsplash 提供的相片