如何自動化 OTP 與 2FA 登入測試
雙因素登入正是那種團隊常在自動化測試裡略過的流程,因為它很麻煩——但偏偏這裡出了迴歸最傷。其實它有兩種情況,而兩種都能自動化。相關的流程可參考測試重設密碼信與魔術連結登入。本文是我們開發者 email 測試指南的一部分。
情況一:email 或簡訊 OTP
如果代碼是透過 email 送來,做法就跟任何 email 測試一樣:開一個拋棄式收件匣、觸發登入、透過 API 讀訊息、把數字取出來。每個測試開一個收件匣,再輪詢(或用 webhook)直到 OTP 落地。
const inbox = await createInbox()
// ...submit the login form with inbox.address...
const msg = await waitForMessage(inbox.id, 30000)
const otp = msg.text.match(/[0-9]{6}/)[0]
// ...type otp into the verification field...
完整的瀏覽器驅動版本見 Playwright email 測試教學,收件匣 helper 則見拋棄式 email API 指南。
情況二:驗證器 App(TOTP)
如果 2FA 用的是驗證器 App,你根本不需要手機——代碼是用 TOTP 演算法從一個共用密鑰推導出來的。把那個密鑰存成測試環境變數,再在測試裡用 otplib 之類的函式庫產生代碼:
import { authenticator } from 'otplib'
const token = authenticator.generate(process.env.TOTP_SECRET)
// ...type token into the 2FA field...
這個密鑰就是 App 在設定 QR code 裡編碼的那一個;在綁定流程中把它顯示出來,並只為測試環境保存下來。
測試環境策略
當兩條路都不方便時,跟團隊談談只給測試用的後門:一個在 staging 永遠有效的特殊 token、對指定測試使用者關掉 2FA,或對來自 CI IP 的請求略過它。挑能用的最小繞道,但仍要真的跑過完整的登入路徑。
開始動手
email 代碼的情況,建立一個郵箱並透過 OpenAPI 去讀;TOTP 的情況,把共用密鑰接好。不論哪一種,每個測試維持一個收件匣或一把密鑰,你的 2FA 測試套件就能保持穩定。