Latihan 1 dari materi Magic Link Authentication di Auth — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.
Lengkapi createMagicLinkStore() di kode awal. Function itu mengembalikan object dengan dua method:
issue(email, now): buat entri untuk email itu, lalu kembalikan token-nya. Token-nya 32 byte acak dari crypto.getRandomValues(new Uint8Array(32)), ditulis sebagai hex, jadi 64 karakter 0-9a-f. Token yang dirakit dari email dan waktu bisa dihitung ulang oleh siapa pun yang tahu email-nya. Entrinya mencatat email, kapan link itu kedaluwarsa, dan apakah sudah dipakai. Link berlaku 15 menit sejak now, dan semua waktu dihitung dalam milidetik.
verify(token, now): cari entri lewat token-nya, lalu periksa berurutan:
Dicek juga dengan store baru: issue('[email protected]', 50), lalu verify token itu di waktu 60 dan 70. Hasilnya harus true|true|[email protected]|already_used: token-nya 64 karakter hex, verifikasi pertama sah untuk [email protected], yang kedua already_used. Dua link untuk email dan waktu yang sama juga harus punya token berbeda.
Hint
Link sekali pakai butuh catatan per token: punya siapa, kapan kedaluwarsa, dan sudah dipakai atau belum. Map dengan token sebagai kunci membuat verify cukup sekali lihat.
Di issue: const bytes = crypto.getRandomValues(new Uint8Array(32)); const token = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join(''); simpan { email, expiresAt: now + 15 * 60 * 1000, used: false } ke Map, lalu return token-nya. Di verify: ambil entrinya, lalu cek berurutan: gak ada, sudah used, now >= expiresAt.