概述
魔法链接的常见缺陷是把令牌明文存储、永不过期且可重复使用,一旦邮件泄露即等于永久访问。正确做法是只存哈希、设短生命周期,并在校验时原子消费,使链接一次性。
关键步骤
- 生成高熵令牌,仅存储其哈希与过期时间。
- 通过 HTTPS 发送含令牌的链接并设置短有效期。
- 校验时原子消费令牌,使之无法复用。
- 把令牌绑定到待定会话或用户,成功后才签发真正会话。
验证
- 数据库泄露不会暴露可用令牌。
- 重复使用同一链接会失败。
- 过期链接被拒绝。
- 链接仅在正确的上下文内有效。
注意事项
- 邮件扫描器可能自动访问链接;可考虑确认按钮或对扫描器友好的落地页。
- 依赖邮件可达性,时效要求高的场景不理想;安全边界转移到了邮箱账户。
适用范围
本条目围绕「实现安全的魔法链接登录」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
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 });