Email Code認証
Email Code認証は、ユーザーのメールアドレスにワンタイム検証コードを送信します。ユーザーがコードを入力すると認証が完了します — パスワードは不要です。
これは2ステップのフローです:
- 送信 — アプリがメールアドレスへのコード送信をリクエスト
- 検証 — ユーザーが受信したコードを入力し、SDKがサーバーで検証
検証コードをリクエストします:
if (error) { console.error('コード送信失敗:', error.message); return;}
console.log('コード送信成功');// data: { attemptId, expiresIn, maskedEmail, isNewUser? }送信オプション
Section titled “送信オプション”interface EmailCodeSendOptions { /** メール本文の locale */ locale?: string; /** コード長 */ codeLength?: 6 | 8;}サーバーはコード送信にレート制限を適用します。同じメールに最近コードが送信された場合、SDKはヘルパーメソッドを提供します:
// コードが保留中か確認 console.log(`コード送信済み。再送信まであと${remaining}秒お待ちください。`);}ユーザーがコードを受信したら検証します:
const { data, error } = await auth.emailCode.verify( '123456');
if (error) { console.error('検証失敗:', error.message); return;}
console.log('認証完了:', data.user);console.log('セッション:', data.session);検証オプション
Section titled “検証オプション”interface EmailCodeVerifyOptions { /** メールが存在しない場合にアカウントを作成する */ createAccountIfNotExists?: boolean;}保留中の検証ヘルパー
Section titled “保留中の検証ヘルパー”SDKはメモリ内で保留中の検証状態を追跡します:
// メールの検証が保留中か確認
// コード有効期限までの残り時間(秒)
// 保留状態をクリア(例:ユーザーがメールを変更したい場合)これらのヘルパーは、カウントダウンタイマーを表示したり、早すぎる再送信を防止するUIの構築に役立ちます。
エラーハンドリング
Section titled “エラーハンドリング”よくあるEmail Codeエラー:
| エラーコード | 意味 | ユーザーへのアクション |
|---|---|---|
AR002001 | 無効なメール形式 | バリデーションメッセージを表示 |
AR002002 | レート制限超過 | カウントダウンタイマーを表示 |
AR002003 | コード期限切れ | 再送信を提案 |
AR002004 | 無効なコード | リトライを許可(回数制限あり) |
AR002005 | 失敗回数超過 | しばらく待ってから再試行 |
const { data, error } = await auth.emailCode.verify(email, code);
if (error) { switch (error.code) { case 'AR002003': showMessage('コードの有効期限が切れました。新しいコードを送信しています...'); await auth.emailCode.send(email); break; case 'AR002004': showMessage('コードが間違っています。もう一度お試しください。'); break; case 'AR002005': showMessage('試行回数が多すぎます。しばらくお待ちください。'); break; default: showMessage(error.message); }}2ステップのEmail Codeログインフローの全体:
import { createAuthrim } from '@authrim/web';
const auth = await createAuthrim({ issuer: 'https://auth.example.com', clientId: 'my-app',});
let currentEmail = '';
// ステップ1: コード送信document.getElementById('send-btn').addEventListener('click', async () => { const email = document.getElementById('email-input').value;
const { data, error } = await auth.emailCode.send(email); if (error) { alert(error.message); return; }
currentEmail = email; // UIをコード入力に切り替え document.getElementById('email-form').style.display = 'none'; document.getElementById('code-form').style.display = 'block';});
// ステップ2: コード検証document.getElementById('verify-btn').addEventListener('click', async () => { const code = document.getElementById('code-input').value;
const { data, error } = await auth.emailCode.verify(currentEmail, code); if (error) { alert(error.message); return; }
// 認証完了 window.location.href = '/dashboard';});
// 戻るボタン(メール変更)document.getElementById('back-btn').addEventListener('click', () => { auth.emailCode.clearPendingVerification(currentEmail); document.getElementById('code-form').style.display = 'none'; document.getElementById('email-form').style.display = 'block';});カウントダウンタイマー付き
Section titled “カウントダウンタイマー付き”async function sendCode(email) { const { data, error } = await auth.emailCode.send(email); if (error) return;
// カウントダウン開始 const timer = setInterval(() => { const remaining = auth.emailCode.getRemainingTime(email); if (remaining <= 0) { clearInterval(timer); document.getElementById('resend-btn').disabled = false; document.getElementById('countdown').textContent = ''; } else { document.getElementById('countdown').textContent = `再送信まで ${remaining}秒`; document.getElementById('resend-btn').disabled = true; } }, 1000);}