MoeMail
ブログに戻る

マジックリンク / パスワードレスログインをテストする

パスワードレス(マジックリンク)ログインは、ユーザーには心地よく、テストには厄介です。入力するパスワードがなく、メールで届く一度きりのリンクだけだからです。とはいえ朗報があります。これは開発者のためのメールテストに出てくる他のすべてと同じ「受信トレイを読む」パターンで、パスワードリセットのテストとはほぼ双子のような関係です。

フロー

  1. 新しい使い捨て受信トレイを払い出し、そのアドレス宛にマジックリンクを要求する。
  2. メールを読み、サインイン URL を取り出す。
  3. その URL を開き、認証済みセッションに入れることをアサートする。

例(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()

createInboxwaitForMessage のヘルパーは、Playwright チュートリアルのものです。Cypress のカスタムコマンドも同じように動きます。

エッジケース

期限切れのリンク、使い切り制御の確認(2 回目のクリックは失敗すべき)、そして存在しないアドレスへのリンク要求(ユーザー列挙を避けるため、応答は成功時と同じにする)です。いずれも上のフローの小さなバリエーションです。第二要素も絡む場合は、OTP と 2FA のテストと見比べてください。

はじめましょう

メールボックスを作成し、OpenAPI ドキュメントを読んで、受信トレイ呼び出しをスイートに組み込んでください。