使用redis实现客户端和服务端token验证
Posted zhoajiahao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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('重要的数据')
以上是关于使用redis实现客户端和服务端token验证的主要内容,如果未能解决你的问题,请参考以下文章