← 中文资源

简体中文版本

实现安全的魔法链接登录

通过邮件下发一次性、短期、经哈希存储的令牌,原子性地校验并绑定请求上下文以防重放。

阅读英文原文

概述

魔法链接的常见缺陷是把令牌明文存储、永不过期且可重复使用,一旦邮件泄露即等于永久访问。正确做法是只存哈希、设短生命周期,并在校验时原子消费,使链接一次性。

关键步骤

  1. 生成高熵令牌,仅存储其哈希与过期时间。
  2. 通过 HTTPS 发送含令牌的链接并设置短有效期。
  3. 校验时原子消费令牌,使之无法复用。
  4. 把令牌绑定到待定会话或用户,成功后才签发真正会话。

验证

  • 数据库泄露不会暴露可用令牌。
  • 重复使用同一链接会失败。
  • 过期链接被拒绝。
  • 链接仅在正确的上下文内有效。

注意事项

  • 邮件扫描器可能自动访问链接;可考虑确认按钮或对扫描器友好的落地页。
  • 依赖邮件可达性,时效要求高的场景不理想;安全边界转移到了邮箱账户。

适用范围

本条目围绕「实现安全的魔法链接登录」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

const token = base64url(crypto.randomBytes(32));
await db.insert({ hash: sha256(token), expiresAt: now + 10 * 60_000 });
// verify: atomic single use
await db.consume(hash, { now });