首页 > 解决方案 > 如何实现账户激活链接过期?

问题描述

我正在尝试实现在用户注册新帐户时发送到用户电子邮件的激活链接到期。

如果用户不点击链接,该链接应在 24 小时后过期。
到目前为止,我可以在注册时将链接发送到用户的电子邮件,链接看起来像这样'http://localhost:3000/auth/activate/${verificationKey}',一切顺利。

但就像我说的,我希望链接在 24 小时后过期,我只是不知道该怎么做。

从到目前为止我收集到的信息来看,我认为一种方法是verificationKey在 24 小时后从我的用户实体/模型中删除该值,然后如果该verificationKey值是虚假的,我需要向用户发送另一个链接。
现在我的问题是,如何检查一个值(在这种情况下user.verification_key)是否已生成超过 24 小时?

这是注册新用户的相关代码:

const user = new User();
user.username = username;
user.password = await bcrypt.hash(password, salt);
user.is_verified = false;
user.verification_key = cryptoRandomString({
length: 10,
type: 'url-safe',
});

有些人建议为此使用Redis,除了它是一个内存存储之外,我对此一无所知,虽然我可以阅读有关此工具的更多信息,但我想知道是否还有其他方法可以做这个。我不知道通过安装 Redis 是否需要在托管我的应用程序时对服务器进行额外配置,我想避免这种情况。

标签: node.jspostgresqlnestjstypeorm

解决方案


由于您已经设置了一些数据库,因此存储一些验证密钥和过期时间是有意义的。您不需要实际删除该验证密钥......只需要在它过期时存储。

也许您有一个单独的 RegVerificationKey 模型,其中包含字段key(随机生成的字符串)、expiration(设置为创建后 24 小时的日期/时间)和userId(与之关联的用户的 ID)。创建此密钥。当您去激活时,只需检查是否有与请求的用户关联的密钥尚未过期。

有人建议为此使用 Redis

这里不需要,您已经有一个可以放入数据的数据库。

我想知道是否有其他方法可以做到这一点

还有一种替代方法,您可以在其中对您的 URL 进行加密签名。基本上,您会将密钥及其到期数据存储在 URL 本身中,并包含一些计算证明您(拥有私钥的人)创建了此 URL。当您的系统收到此 URL 时,它可以验证该 URL 是否已正确签名,甚至无需查阅数据库。这种方法可能很复杂,在您的情况下可能没有用。我只是在这里提到它作为替代方案。查看 JWT 以了解一种可能的实现: https ://jwt.io/


推荐阅读