有没有自定义的Django电子邮件确认链接模块?
我正在搭建一个网站,用户可以在上面报名参加狗狗训练课程。客户希望能够通过一个邮件确认链接,自动将当前班级的学员注册到即将开班的课程中。
我希望用户在操作时不需要登录网站。因此,所有相关的信息都需要包含在生成的链接中。这个链接最好能经过某种方式的加密,这样随机的机器人请求就不会搞乱系统。
有没有现成的应用或方法可以用来实现这个功能呢?
1 个回答
3
当你在后台创建并发送邮件时,可以为用户生成一个带时间戳的令牌(其实就是用户状态的一个哈希值)。把这个令牌和用户的UID编码到网址里,然后在用户点击链接时,在注册页面检查它的有效性。通过对用户状态进行哈希处理,可以确保(在实际操作中)你不会遇到机器人随机生成正确网址的问题。
在 contrib.auth
中,内置的密码重置视图基本上就是这样做的。发送给用户的重置邮件中的网址最后有两个参数——一个是经过 base-64 编码的 UID,另一个是生成的令牌。令牌生成的源代码在这里:https://github.com/django/django/blob/master/django/contrib/auth/tokens.py,相关的视图是 password_reset_confirm
,可以在这里找到:https://github.com/django/django/blob/master/django/contrib/auth/views.py
你也可以为你的应用实现类似的功能,但在生成令牌时要小心。在 contrib.auth
的令牌生成器中,他们会对用户的整个内部状态进行哈希,包括密码的哈希值,这样可以确保链接只在一次有效,因为用户重置密码后,密码的哈希值会改变。如果你想确保链接只有效一次,就必须在哈希中包含一些其他会改变的状态。