认证这里,https://www.jianshu.com/p/fa358b32dab0
每个用户登录都会往数据库里写一条数据,然后每次访问需要登录的地址时都要去数据库检查一下token, 这对数据库的压力比较大
现提供一种方法不往数据库写token验证
用户登陆成功以后用自己的方式加密一下用户的id
我用的是
"吃葡萄不吐葡萄皮 id 不吃葡萄倒吐葡萄皮"用md5加密,后面再拼上"|id"
将这个字符串作为token返回给前台
然后访问其他的需要登录的页面时url里拼上这个就好了
例如,: id为1的用户登录了, 生成一个7f38e7a645fbd1b3c68fbc75ecd62d24|1
字符串
id为2的用户登录了, 生成一个a07687f76d66557e59db18bd89910e3a|2
字符串
访问其他页面时带上这个字符串,例如访问书本详情时的url为:
http://127.0.0.1:8000/books/1?token=a07687f76d66557e59db18bd89910e3a|2
token翻译成明文就是吃葡萄不吐葡萄皮2不吃葡萄倒吐葡萄皮|2
在认证里面通过 " | " 切分取到id , 再通过上面的加密方式生成token与url里面的进行对比
代码示例:
获取加密字符串的函数
import hashlib
def get_token(id):
md5=hashlib.md5()
md5.update('吃葡萄不吐葡萄皮'.encode('utf-8'))
md5.update(str(id).encode('utf-8'))
md5.update('不吃葡萄倒吐葡萄皮'.encode('utf-8'))
return md5.hexdigest()
登录成功以后生成token:
token = methord.get_token(user.id)+'|'+str(user.id)
认证类
class LoginAuth:
def authenticate(self, request):
token = request.GET.get('token')#获取url的token
id = token.split('|')[1]#拿到id
re_token = methord.get_token(id) + '|' + str(id)#根据我的加密方式进行加密
if token == re_token:#判断url的token是否正确
user=models.UserInfo.objects.filter(pk=int(id)).first()
return user,user
else:
raise APIException('还没登录')