Django结合itsdangerous实现邮箱激活与账户验证
本文介绍如何在Django项目中利用itsdangerous库生成加密的激活链接,并通过SMTP服务发送验证邮件。通过配置settings.py及编写RegisterView视图类,实现用户注册后发送包含加密Token的邮件,用户点击链接后系统解密验证并激活账户,确保链接安全与时效性。
业务场景要求:当用户完成注册页面提交后,系统需自动向该用户邮箱发送一封激活邮件。用户点击邮件中的特定链接以完成账户激活,且该链接内包含的用户身份信息必须经过加密处理,以保障安全性。
关于如何开启个人邮箱的SMTP服务,此处不再赘述。参考菜鸟教程或其他网络资源,均有详尽的操作指南可供查阅。
首先,需要在Django项目的settings.py配置文件中添加邮件发送相关的参数,具体配置如下:
# 固定写法 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # smtp服务器地址 EMAIL_HOST = 'smtp.qq.com' # 固定端口号 EMAIL_PORT = 25 #发送邮件的邮箱 EMAIL_HOST_USER = '2746565701@qq.com' #在邮箱中设置的客户端授权密码 EMAIL_HOST_PASSWORD = 'ytnvwapcbxmcdfig' #收件人看到的发件人,尖括号中的必须与上面的user一致 EMAIL_FROM = '天天生鲜<2746565701@qq.com>'
以下是用户模块views.py文件中涉及itsdangerous模块及邮件发送的核心代码。为聚焦核心逻辑,已剔除项目其他无关代码,此处采用基于类的视图(Class-Based View)实现:
核心处理流程如下:
- 使用itsdangerous模块对用户信息进行加密,生成包含用户标识的加密令牌(token);
- 调用Django内置的邮件发送功能,将包含激活链接的邮件发出(前提已完成邮件配置);
- 邮件中的激活链接包含一个可变参数,该参数为用户ID的加密字符串;
- 用户收到邮件并点击链接后,请求将跳转至指定的视图类进行后续处理;
- 负责激活处理的视图类接收请求,解密用户信息以提取用户ID,并据此查询数据库中的对应用户(此过程会校验加密信息是否已过期);
- 将数据库中该用户的is_active字段值更新为1,标记该用户已激活;
- 处理完成后,重定向至网站首页;
# 导入itsdangerous中要用到的加密类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 导入itsdangerous中超时的异常
from itsdangerous import SignatureExpired
# 导入配置文件
from django.conf import settings
# 导入Django中的发送邮件的方法
from django.core.mail import send_mail
from .models import User
# Create your views here.
class RegisterView(View):
"""注册"""
....................
def post(self, request):
"""进行注册处理"""
# 发送激活邮件,包含一个激活的链接:https://127.0.0.1:8000/user/active/3
# 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
# 加密用户的身份信息,生成激活的token
serializer = Serializer(settings.SECRET_KEY, 3600) # 创建爱一个itsdangerous模块中加密类的对象,其中SECRET_KEY用settings中的,第二个参数为超时时间
info = {'confirm': user.id} # 被加密的信息,一个字典,字典值为接收邮件用户的id
# 利用dumps方法进行加密,加密后为bytes数据
token = serializer.dumps(info) # bytes数据
token = token.decode() # bytes转str
# 发邮件
subject = '天天生鲜欢迎信息' # 邮件主题
message = '' 邮件信息,因为有html__message了,所以这里为空就好
sender = settings.EMAIL_FROM # 发送者,直接从配置文件中导入上面配置的发送者
receiver = [email] # 接收者的邮箱,是一个列表,这里是前端用户注册时传过来的 email
# html结构的信息,其中包含了加密后的用户信息token
html_message = '<h1>{},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的用户<br><a href="http:127.0.0.1:8000/user/active/{}" rel="external nofollow" >http:127.0.0.1:8000/user/active/{}</a>'.format(username, token, token)
# 调用Django发送邮件的方法,这里传了5个参数
send_mail(subject, message, sender, receiver, html_message=html_message)
# 返回应答:跳转到首页
return redirect(reverse('goods:index'))
class ActiveView(View):
"""用户激活"""
def get(self, request, token):
"""进行用户激活"""
# 进行解密,获取要激活的用户信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
# 通过itsdangerous模块的loads方法解密
info = serializer.loads(token)
# 获取待激活用户的id
user_id = info.get('confirm')
# 根据id获取用户信息
user = User.objects.get(id=user_id)
# 激活用户操作,将数据库中对应用户的is_active参数变为1
user.is_active = 1
user.save()
# 跳转到登录界面
return redirect(reverse('user:login'))
except SignatureExpired as e:
# 激活链接已经过期
return HttpResponse('激活链接已过期!')
以上内容为本文的全部讲解,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









