itsdangerous模块实现邮箱令牌认证
前言:用户通过邮箱来找回密码时通常是服务端朝用户邮箱发送一个修改密码的链接地址,用户通过该访问该地址来修改密码。
针对上述需求,我们有两种方法可以实现
- 方法一:只需要在返回给用户的修改密码的url后拼接一个串(令牌)然后后端讲串存入redis缓存数据库中并设置过期时间,用户访问修改密码页面时先朝着后端接口发起一个get请求,讲串取出到redis里找,如果存在才让他继续访问,否则就直接返回令牌失效。
方法二:使用itsdangerous生成临时身份令牌
itsdangerous是一个django第三方的用来生成临时身份令牌的模块,内部默认使用了HMAC和SHA1来签名,基于Django签名模块。
使用:
实例化一个序列化器对象,传入两个参数:私钥,过期时间
使用dumps对数据加密,loads对数据解密,如果数据被篡改就会抛出BadSignature异常,如果超时则会抛出Signature expired异常
安装
pip install itsdangerous
使用
import itsdangerous
salt='sdaf'#加盐
t=itsdangerous.TimedJSONWebSignatureSerializer(salt,expires_in=600)#过期时间600秒
info = {'username':'yangfan','user_id':1}
# =========加密token============
res=t.dumps(info)
token=res.decode()#指定编码格式
print(token)
# eyJleHAiOjE1NzUwMDczNjgsImlhdCI6MTU3NTAwNjc2OCwiYWxnIjoiSFM1MTIifQ.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InlhbmdmYW4ifQ.yUb3PW53V89ZX4Ci2qeaBJIiizt0JUAN_W9BBzg8QkIR1-uO7NQl6jizSUReOFGanWzfG19t7XFHCWv1JGMIZw
# =========解密token============
res = t. ('eyJhbGciOiJIUzUxMiIsImV4cCI6MTU3NTAwNzM0MywiaWF0IjoxNTc1MDA2NzQzfQ.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InlhbmdmYW4ifQ.k-Q1VyN2TOlQ4flHHoiOYEMRaUEiN5Ms2JgeRdnCZWbQB-WwQ1FScoBWxFGkCYEPoWVpAjQxDBQeBesmulZupQ')
# res = t.loads(token)
print(res)
# {'username': 'yangfan', 'user_id': 1}
# 当超时或值有误则会报错