使用redis实现客户端和服务端token验证

实在是思维江化啊,没有想到可以给redis设置不同的key值来实现不同key值存储不同的value值,而一直想着给一个名为token的key值新增不同的数据,并设置过期时间,然而这样却不能新增只能做到覆盖,因此纠结了好一会。狠狠抽自己一巴掌Ծ‸Ծ。

client端

import requests
token = "dnsjabdjsabdnjsabdnjsabjdsbajhdbsa"

###### 1.第一种,对称加密

# res = requests.get('http://127.0.0.1:8000/asset/', headers={'token':token})
# print(res.text)

###### 2.第二种,不对称加密
import time

ctime = time.time()

tmp = "%s|%s" % (token, ctime)

import hashlib

m = hashlib.md5()
m.update(bytes(tmp, encoding='utf8'))
res = m.hexdigest()

client_token = "%s|%s" % (res, ctime)

print(client_token)
res = requests.get('http://127.0.0.1:8000/asset/', headers={'token':client_token})
print(res.text)

server端

#三层验证,保证安全性
def asset(request):

    if request.method == 'POST':

        print(request.body)

        return HttpResponse('ok')
    else:
        #### 连接数据库, 获取存储的主机名
        token = 'dnsjabdjsabdnjsabdnjsabjdsbajhdbsa'
        #META里面是http的一些请求头信息
        res = request.META.get('HTTP_TOKEN')
        client_token, ctime = res.split('|')
        # if token != client_token:
        #     return  HttpResponse('非法的请求!')
        
        #第一关,设置有效时间
        server_time = time.time()

        if float(server_time) - float(ctime) > 20:
            return HttpResponse('第一关:key过期')
        
        #第二关,校验token值
        tmp = "%s|%s" % (token, ctime)
        import hashlib
        m = hashlib.md5()
        m.update(bytes(tmp, encoding='utf8'))
        server_token = m.hexdigest()

        if server_token != client_token:
            return  HttpResponse('第二关:非法的请求!')

        ### 第三关,token只能使用一次,并设置过期时间,防止数据堆积
        ### decode_responses=True可以使从redis得到的数据不是bytes类型
        
        ### django连接redis, 将key发到redis中, 并设置过期时间
        r = redis.Redis(host='127.0.0.1', port=6379, db=1,decode_responses=True)

        #实现方法,就是这么简单
        if ctime==r.get(client_token):
            return HttpResponse('第三关 已经访问过了')
        r.setex(client_token,20,ctime)
        return HttpResponse('重要的数据')

猜你喜欢

转载自www.cnblogs.com/zhoajiahao/p/11841082.html