想法1

服务端客户端个保存相同的一串字符串,客户端发送API请求时带着这段字符串来我服务端做校验,通过则返回相应数据,否则拒绝访问

弊端

黑客截取到请求信息,可直接会获取到该字符串,想服务端发送请求并能获取到数据,安全性太低

想法2

设置动态的随机验证码,那么字符串我们不变,利用时间的动态性,我们将固定的字符串加上当前请求时间,利用md5加密算法生成随机验证码,那么我们在发送数据的时候,除了要发生成的随机验证码外,还要将当前请求的时间也一并发给服务端,这样服务端才可以利用客户端发来的时间和实现存好的校验字符串凭借加密在对比客服端的来判断是否相同,

优点

1.时间限制

2.加密规则限制(字符串不能被修改)

弊端

看似完美,但是暴露出来的问题也是致命的,相当于你每产生一个验证码只要被黑客截取到,那都是有效的,也就是说随着项目运行时间的增加,黑客手里拿到能访问你API接口的认证字符串都可以拿去卖钱了

想法3

在上面的基础上在加上一条过期时间的限制,也就是当用户第一次来访问时,将验证字符串和对应的时间作为键值存储起来并且设置超时时间(这个可以放入Redis或MongoDB中,因为他们在设置键值时可以给这个键值对设置超时时间,超时自动清除)

优点

设置了三道关卡来校验用户的合法性

小Bug

黑客的网速比你快很多,你在发送的途中,黑客截取了并先你一步发送成功,那么你就变成了非法用户了,当然这种情况发生的概率是很小的,。

处理办法

将你发送的整个数据都进行加密,那么就算黑客拿到你的数据并比你快一步提交了,那么相当于在帮你提交数据,

具体了解猛击这里

import requests
import time
import hashlib def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
ctime = str(time.time())
new_key = "%s|%s" %(key,ctime,) # asdfuasodijfoausfnasdf|时间戳
md5_str = md5(new_key)
# 6f800b6a11d3f9c08c77ef8f77b2d460, # asdfuasodijfoausfnasdf|时间戳
auth_header_val = "%s|%s" %(md5_str,ctime,) # 6f800b6a11d3f9c08c77ef8f77b2d460|时间戳
print(auth_header_val) response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':auth_header_val})
print(response.text)

客户端代码

import hashlib
import time
def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
# redis,Memcache
visited_keys = {
# "841770f74ef3b7867d90be37c5b4adfc":时间,
} def api_auth(func):
def inner(request,*args,**kwargs):
server_float_ctime = time.time()
auth_header_val = request.META.get('HTTP_AUTH_API')
# 841770f74ef3b7867d90be37c5b4adfc|1506571253.9937866
client_md5_str, client_ctime = auth_header_val.split('|', maxsplit=)
client_float_ctime = float(client_ctime) # 第一关
if (client_float_ctime + ) < server_float_ctime:
return HttpResponse('时间太久了,再去买一个吧') # 第二关:
server_md5_str = md5("%s|%s" % (key, client_ctime,))
if server_md5_str != client_md5_str:
return HttpResponse('休想') # 第三关:
if visited_keys.get(client_md5_str):
return HttpResponse('你放弃吧,来晚了') visited_keys[client_md5_str] = client_float_ctime
return func(request,*args,**kwargs) return inner @api_auth
def test(request):
return HttpResponse('正常用户')

服务端代码

服务端将我们API验证的代码块写成装饰器的形式~~~

基于Tornado签名cookie源码设计API认证的更多相关文章

  1. 阿里云视频直播API签名机制源码

    阿里云视频直播API签名机制源码 本文展示:通过代码实现下阿里视频直播签名处理规则 阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail ...

  2. 从SpringBoot启动,阅读源码设计

    目录 一.背景说明 二.SpringBoot工程 三.应用上下文 四.资源加载 五.应用环境 六.Bean对象 七.Tomcat服务 八.事件模型 九.配置加载 十.数据库集成 十一.参考源码 服务启 ...

  3. 【 js 基础 】【 源码学习 】源码设计 (持续更新)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...

  4. 以太坊go-ethereum签名部分源码解析

    以太坊go-ethereum签名部分源码解析 golang标准库里的crypto/ecdsa椭圆曲线加密算法所提供的函数有: ecdsa.PublicKey结构体通过持有一个elliptic,Curv ...

  5. 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...

  6. (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  7. 基于Eclipse搭建Hadoop源码环境

    Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...

  8. 手机自动化测试:Appium源码之API(2)

    手机自动化测试:Appium源码之API(2)   TouchAction AppiumDriver的辅助类,主要针对手势操作,比如滑动.长按.拖动等.TouchAction的原理是讲一系列的动作放在 ...

  9. 手机自动化测试:Appium源码之api(1)

    手机自动化测试:Appium源码之api(1)   AppiumDriver getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. driver.getAppStri ...

随机推荐

  1. ELK的sentinl告警配置详解

    背景 sentinl的监控&告警是通过watch实现的. 一.Watch Execution 执行开始的时候, watcher为watch创建watch执行上下文. 执行上下文提供脚本和模板, ...

  2. java中的泛型与反射

    在java开发中,大多数情况是多人开发,那么如何在没有API的情况下,快速的理解到别人开发的一些类的详细信息呢? 比如函数名,类名,返回参数等等 我们可以定义一个反射机制的类,通过此类来打印此你想要操 ...

  3. 数据库之mysql篇(1)—— 数据库管理系统简介/mysql的安装、配置

    说mysql之前,还是先说说数据库. 什么是数据库: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后 ...

  4. lambda表达式2

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  5. 【PAT】B1011 A+B 和 C

    注意数据的范围,使用long long就行了 #include<stdio.h> int main(){ int N;scanf("%d",&N); for(i ...

  6. php笔记(一)php介绍及数据类型

    php 官方手册:http://php.net/manual/zh/ 1.PHP(全称 Hypertext Preprocessor,超文本预处理器的字母缩写)是一种服务器端脚本语言,它可嵌入到 HT ...

  7. Docker: docker image常用命令实战

    #docker列出镜像[root@192 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 881bd08c0b08 ...

  8. [JS]js中判断变量类型函数typeof的用法汇总[转]

    1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串.  可能的字符串有:"number"."string"."boolean&q ...

  9. UVA1623-Enter The Dragon(并查集)

    Problem UVA1623-Enter The Dragon Accept: 108  Submit: 689Time Limit: 3000 mSec Problem Description T ...

  10. Mybatis之插件拦截

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默 ...