我正在建立一个人们报名参加狗训练班的网站。客户希望通过电子邮件确认链接自动为当前班级注册即将上课的人员。
我希望他们能够在不必登录网站的情况下完成此操作。因此,所有相关信息都需要包含在生成的链接本身中。理想情况下,链接会以某种方式加扰,因此机器人的随机请求不会导致错误。
是否存在人们用来执行此操作的现有应用/约定?
答案 0 :(得分:3)
您可以在后端创建和发送电子邮件时为用户生成带时间戳的令牌(基本上是用户状态的哈希值)。在URL中为该用户编码该令牌和UID,然后在访问该链接时在注册视图中检查其有效性。散列用户状态保证(出于所有实际目的),您不会遇到随机生成任何正确URL的机器人的任何问题。
contrib.auth
中的内置密码重置视图基本上完成了这一点。发送给用户的重置电子邮件中的URL最后有两个参数 - base-64编码的UID和生成的令牌。令牌生成的来源位于:https://github.com/django/django/blob/master/django/contrib/auth/tokens.py,相关视图位于https://github.com/django/django/blob/master/django/contrib/auth/views.py的password_reset_confirm
您可能可以为您的应用程序实现非常类似的东西,但是您必须要小心如何生成令牌。在contrib.auth
令牌生成器中,它们散列用户的整个内部状态,包括密码哈希,这保证链接只有一次有效,因为在用户重置密码后密码哈希将被更改。如果你想确保链接只有一次有效,你必须包含一些其他状态,保证在哈希中有所改变。