django-签名加密模块It's dangerous--加密token

琴刚豪
2023-12-01

首先安装包

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple itsdangerous

//或
pip install itsdangerous

在使用时导入类

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
# 在 settings文件里面,可以导入其中的一个常量,作为秘钥,所以需要导入 settings.py 文件
# 这个值是django内置的一个东西,可以拿来当做秘钥
# # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '-=kx9*n=4$y2%e)9_w-!k*_xzy_#@)e50$*4r@k(6j0f@a@=ap'


from django.conf import settings

# 加密用户的身份信息,生成激活的token
# 创建序列化对象,Serializer(私钥, 生命周期(秒))
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'confirm': user.id}      # user 就是我获取的需要加密的用户信息
token = serializer.dumps(info)   # 显示的是 b'' 类型数据, 也就是 bytes类型数据,我们把它转换为字符串
# 通过序列化器dumps方法进行加密.dumps里传的是键值对 是二进制
token = token.decode()   # 默认按照utf-8进行解码,变成字符串,这样才能变成一个参数,放到设置的激活链接后面而不会报错。

# 发邮件,放到celery_tasks.task.py里进行异步处理,这里进行调用
        # subject = '天天生鲜欢迎信息'
        # message = ''
        # sender = settings.EMAIL_FROM
        # receiver = [email]
        # html_message = '<h1>%s, 欢迎您成为天天生鲜的注册会员</h1>请点击下面的链接激活您的账户<br/> <a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>'%(username, token, token)
        # # 邮件内容中有html标签时需要用html_message 避免标签被转义.
        # send_mail(subject, message, sender, receiver,html_message=html_message)

        # 这里是任务发出者
        # 调用celery_tasks.task.py进行邮件发送,通过delay把任务放入到任务队列
        send_register_active_email.delay(email, username, token) # email在tasks里定义参数为to_email

        # 返回应答,跳转到首页
        return redirect(reverse('goods:index'))

接收到链接之后,我们提取到加密之后的token,就需要对它解密,获得它的真实值(id)

class ActiveView(View):
    '''用户激活'''
    def get(self, request, token):
        '''进行用户激活'''
        # 必须和加密时使用的密钥相同
        serializer = Serializer(settings.SECRET_KEY, 3600)
        try:
            info = serializer.loads(token)      # 解密
            # 获取待激活用户的id
            user_id = info['confirm']   #dumps里传的是键值对 是二进制,这里通过键获取值

            # 根据id获取用户信息
            user = User.objects.get(id=user_id)
            user.is_active = 1
            user.save()


            # 跳转到登录页面
            return redirect(reverse('user:login'))
        except SignatureExpired as e:
            # 激活链接已实效
            return HttpResponse('激活链接已过期')
            # 实际项目中,若已过期会返回一个页面,告诉已过期,并且点击链接会重新发送邮件
 类似资料: