Use redis achieve the client and server token validation

It is thinking of Jiang, ah, I did not think you can set a different key value to redis to implement different values ​​in different key values ​​stored value, and have been thinking about for a key value of the new token called different data, and set an expiration time However, this can not only do the new cover, so tangled for a while. Fiercely pumping his slap Ծ‸Ծ.

client end

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)

end 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('重要的数据')

Guess you like

Origin www.cnblogs.com/zhoajiahao/p/11841082.html