代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
"""
@Remark: 接口安全(接口数据校验)
"""
import time
from utils.jsonResponse import SuccessResponse,ErrorResponse
from utils.common import ly_md5
from django_redis import get_redis_connection
key = 'lybbn_sxfwanwlaqwanctcswan999666'
visited_keys = {
#"332d3ddklllskkdwwwiissswewsw":时间
}
"""
使用方法,一般使用@ly_api_security,如果是drf中需要
from utils.apisecurity import ly_api_security
from django.utils.decorators import method_decorator
然后再具体的请求方法前面如get、post前面添加:@method_decorator(ly_api_security)
客户端需要在http头部添加auth-api头部字段
"""
#接口安全装饰器
def ly_api_security(func):
def inner(request,*args,**kwargs):
server_float_time = time.time()
try:
auth_header = request.META.get('HTTP_AUTH_API')
# 332d3ddklllskkdwwwiissswewsw|1632392265.7424471|13234
if not auth_header:
return ErrorResponse(msg='缺少认证头部信息')
client_md5,client_time,random_str = auth_header.split('|',maxsplit=2)
except Exception as e:
return ErrorResponse(msg="接口安全校验值错误")
client_float_time = float(client_time)
if len(random_str) !=5:
return ErrorResponse(msg="第五个字段只能为5位")
#第一重验证(时间校验)
if(client_float_time +200) < server_float_time:
return ErrorResponse(msg='接口校验时间过期')
#第二重验证(md5校验)
server_md5 = ly_md5("%s|%s|%s"%(key,client_time,random_str))
if server_md5 != client_md5:
return ErrorResponse(msg='接口加密校验失败')
# #第三重验证(第几次访问校验)采用本地字典验证
# if visited_keys.get(client_md5):
# return ErrorResponse(msg='该校验头部您已经使用过,请使用新的校验信息')
# visited_keys['client_md5'] = client_float_time
#第三重验证(第几次访问校验)采用redis验证(增加md5+ip方式存储解决不同ip下的并发访问问题)
client = get_redis_connection('authapi')
if client.get(client_md5):
return ErrorResponse(msg='该校验头部您已经使用过,请使用新的校验信息')
client.set(client_md5,client_float_time,ex=86400)#1天有效期
return func(request,*args,**kwargs)
return inner
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。