使用redis實現客戶端和服務端token驗證

實在是思惟江化啊,沒有想到能夠給redis設置不一樣的key值來實現不一樣key值存儲不一樣的value值,而一直想着給一個名爲token的key值新增不一樣的數據,並設置過時時間,然而這樣卻不能新增只能作到覆蓋,所以糾結了好一會。狠狠抽本身一巴掌Ծ‸Ծ。python

client端redis

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('重要的數據')
相關文章
相關標籤/搜索