Node.js - 注册时发送电子邮件

13

我有一个带有单个电子邮件字段的注册表格。当用户输入他的电子邮件时,我需要发送一个注册链接。

我看过了这个Node.js示例注册表格 (链接) 。但是它只有一个发送欢迎电子邮件的功能。

是否有任何具有发送注册电子邮件功能的Node.js应用程序示例?

1个回答

26

到目前为止,我还没有见过这样的例子,但是你的次要问题是什么? 你提供的示例很好地展示了如何发送电子邮件。另一个选择是使用此软件包:

github.com/andris9/Nodemailer

它似乎也有很好的文档介绍如何发送电子邮件。

因此,我假设您想知道如何设置注册系统。一种方法是拥有一个用于注册用户的表格,其中具有“电子邮件”和“令牌”列。“电子邮件”是明显的,“令牌”是一个随机生成的字符串(例如使用node的“crypto.randomBytes”方法),将作为链接的一部分发送给用户。输入链接后,您可以搜索此令牌的数据库,如果找到,则进行注册。

需要注意两件事:在创建令牌时,请确保它尚未存在于数据库中。其次:最好使用“valid_until”列来删除几小时之前的令牌。

更新:

不幸的是,节点的base64导出不是安全的url。因此,我发现以下是获得安全令牌的最简单方法:

require('crypto').randomBytes(48, function(ex, buf) {
    token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
});

也许有人会提出更好的解决方案。


1
嗯,我想这和电子邮件一样安全。由于您尚未拥有密码,因此无法通过密码验证用户,因此您必须相信知道通过电子邮件发送的秘密令牌的用户是实际的电子邮件所有者。如果您想要额外的保护,可以在时间上检查请求IP。我不知道节点示例,但我已经看到这个原则在rails应用程序中使用过。 - Hubert OG
@HubertOG 一个快速的问题 - 我们需要强制令牌唯一吗?如果我们发送一个链接,例如www.example.com/register/username/token,并在数据库中搜索一个行,其中user.username = username和user.token = token,这是否足够? - funseiki
1
@funseiki 不用担心碰撞 - 使用48个加密随机字节的整个目的是使您无论如何都找不到碰撞,因为可能的密钥数量为8^48(2.2300745e + 43)。为了让您了解,这使得落在特定令牌上的几率约为地球上沙粒数量的三万亿倍。如果您偶然发现相同的令牌,那么这绝非巧合。 - Stuart P. Bentley
2
稍微退后一步,当您向数据库添加更多文档时,碰撞概率并不完全等同于键空间。请参见http://en.wikipedia.org/wiki/Birthday_problem。 - Stuart P. Bentley
@HubertOG 显然,node_mailer已经被弃用,建议使用https://github.com/andris9/Nodemailer。因此,请根据新的更好的解决方案编辑您的答案! - nbro
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接