zoukankan      html  css  js  c++  java
  • 使用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('重要的数据')
    
  • 相关阅读:
    springMVC准确定位多个参数对象的属性
    java正则表达式应用
    mybatis与mysql插入数据返回主键
    xml文件中怎么写小于号 等特殊符号
    sqlserver 分页查询 举例
    Python报错:IndentationError: expected an indented block
    统计输入的汉字,数字,英文,other数量
    easyui+ajax获取同表关联的数据
    JAVA死锁
    mybatis自动生成mapper,dao映射文件
  • 原文地址:https://www.cnblogs.com/zhoajiahao/p/11841082.html
Copyright © 2011-2022 走看看