MoeMail
返回部落格

測試魔術連結/免密碼登入

免密碼(魔術連結)登入對使用者很貼心,對測試卻很尷尬:沒有密碼可填,只有一個由 email 送來的一次性連結。好消息是——它和開發者 email 測試裡所有東西一樣,都是同一套讀收件匣模式,幾乎就是重設密碼測試的雙胞胎。

流程

  1. 開一個全新的拋棄式收件匣,並對它請求一個魔術連結。
  2. 讀信,把登入用的 URL 抓出來。
  3. 打開那個 URL,斷言你落進了一個已登入的 session。

範例(Playwright)

const inbox = await createInbox()
await page.goto('/login')
await page.getByLabel('Email').fill(inbox.address)
await page.getByRole('button', { name: 'Send magic link' }).click()

const msg = await waitForMessage(inbox.id, 30000)
// first http(s) URL in the email body
const link = (msg.links && msg.links[0])
  || msg.text.split(/\s+/).find(w => w.indexOf('http') === 0)

await page.goto(link)
await expect(page.getByText('Signed in')).toBeVisible()

這裡的 createInbox / waitForMessage helper 來自 Playwright 教學Cypress 的自訂指令用法也一樣。

邊界情況

已過期的連結、一次性的強制檢查(第二次點擊應該要失敗),以及對未知地址請求連結(回應要和正常情況一致,以免洩漏使用者是否存在)。每一個都是上面流程的小變形。若同時還涉及第二道因素,可對照OTP 與 2FA 測試

開始動手

建立一個郵箱,再讀讀 OpenAPI 文件,把收件匣相關呼叫接進你的測試套件。