本节内容:

  • 基本的api
  • 升级的api
  • 终极版api

环境:Djanao,

项目名:api_auto,

app:api

角色:api端,客户端,黑客端

1.基本的api

【api端】

#api_auto/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from api import urls urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
]
#api/urls.py
from django.conf.urls import url
from . import views import include
urlpatterns = [
url(r'^asset.html', views.asset),
]
#api/views.py
from django.shortcuts import render,HttpResponse
# Create your views here. def asset(request):
print(request.POST)
return HttpResponse('api访问成功') #输出,这样api端就可以拿到客户端的数据
<QueryDict: {'k2': ['sssss'], 'k1': ['v1sss']}

【客户端】

# -*- coding: UTF-8 -*-
#blog:http://www.cnblogs.com/linux-chenyang/ import requests data_dict = {
'k1':'v1sss',
'k2':'sssss',
} ret = requests.post(
url='http://127.0.0.1:8000/api/asset.html',
data=data_dict,
) print(ret.text) #输出,api段会返回给客户端一个结果
api访问成功

2.升级的api

由于上面这种方法没有认证,假如任何人都可以发post请求,很不安全,引出下面这种方法,让客户端带个key过来,api端先检查在不在我的列表里,不在的话就不允许访问。

【api端】

#api/views.py

def asset(request):
app_key_dict = {
'de3908e1-31c3-4de8-a535-7830cca5a427':{'name':'中共中央国务院','level':10},
'd7b64313-9e62-4441-9f10-b21288a1431a':{'name':'老男孩教育','level':1},
}
agent_app_key= request.GET.get('app_key')
if agent_app_key in app_key_dict:
name = app_key_dict[agent_app_key]['name']
print(name)
return HttpResponse('api访问成功!')
else:
return HttpResponse('认证失败,不能访问api')
#输出
[08/Aug/2017 15:48:27] "POST /api/asset.html?app_key=de3908e1-31c3-4de8-a535-7830cca5a427 HTTP/1.1" 200 3
中共中央国务院

【客户端】

import  requests

app_key = 'de3908e1-31c3-4de8-a535-7830cca5a427'
data_dict = {
'k1':'v1',
'k2':'v2',
} ret = requests.post(
url='http://127.0.0.1:8000/api/asset.html',
params={'app_key':app_key},
data=data_dict,
) print(ret.text)

这种方法有个弊端,假如黑客通过抓包或者其他方法获取到服务器的url,那么客户端依然可以访问。

【黑客端】

import  requests

data_dict = {
'k1':'v1sss',
'k2':'sssss',
} ret = requests.post(
url='http://127.0.0.1:8000/api/asset.html?app_key=de3908e1-31c3-4de8-a535-7830cca5a427',
data=data_dict,
) print(ret.text)

3.终极版api

【api端】

#api/views.py

def asset2(request):
'''
用于验证3的加密匹配
:param request:
:return:
'''
def create_md5(app_key,app_secret,timestamp):
import hashlib
m = hashlib.md5(bytes(app_secret,encoding='utf-8'))
temp = "%s|%s" %(app_key,timestamp,)
m.update(bytes(temp,encoding='utf-8'))
return m.hexdigest() '''
api端存放的客户段的key
'''
app_key_dict = {
'66244932-3a61-48c5-b847-9a750ba6567e':
{
'name':'中共中央国务院',
'level': 10,
'secret': 'asd=asdfkdf',
'record': [
{'sign': '3a8530132a55512c9937c60df63ba868','timestamp': 1494042557.7139883}
]
},
'49684626-71fc-450a-b2bb-dfde77d2cbd3': {'name':'老男孩教育','level': 1,'secret': 'as2dasdf=asdf','record': []},
} """
从客户发来的url后拿到所需要的数据,key
"""
agent_app_key = request.GET.get('app_key')
agent_app_sign = request.GET.get('app_sign')
agent_app_timestamp = float(request.GET.get('app_timestamp')) """
验证1.判断秘钥app_key正不正确
"""
if agent_app_key not in app_key_dict:
return HttpResponse('二货,一垒都上不了...') """
验证2.客户端过来的key和服务器端之间时间不超过5秒
"""
server_timestamp = time.time()
if (server_timestamp - 5) > agent_app_timestamp:
return HttpResponse('滚,时间怎么这么长...') """
验证3.反解密,匹配加密的key是否正确,secret从api端拿
"""
server_sign = create_md5(agent_app_key,app_key_dict[agent_app_key]['secret'],agent_app_timestamp)
if agent_app_sign != server_sign:
return HttpResponse('小样,你还给我修改url,太嫩了...') """
验证4.有了一个访问的客户端,同样的key在不能访问
"""
record_list = app_key_dict[agent_app_key]['record']
for item in record_list:
if agent_app_sign == item['sign']:
return HttpResponse('煞笔,来晚了...') app_key_dict[agent_app_key]['record'].append({'sign': agent_app_sign,'timestamp': agent_app_timestamp}) # 数据加密 rsa
# http://www.cnblogs.com/wupeiqi/articles/6746744.html name = app_key_dict[agent_app_key]['name']
return HttpResponse(name)

api端

import  requests,time
def god2():
"""
app_sign:这样就根据app_key+app_secret+timestamp生成动态的字符串
:return:
"""
def create_md5(app_key,app_secret,timestamp):
import hashlib
m = hashlib.md5(bytes(app_secret,encoding='utf-8'))
temp = "%s|%s" %(app_key,timestamp,)
m.update(bytes(temp,encoding='utf-8'))
return m.hexdigest() app_key = '66244932-3a61-48c5-b847-9a750ba6567e'
app_secret = "asd=asdfkdf"
app_timestamp = time.time()
app_sign = create_md5(app_key,app_secret,app_timestamp) """
api请求:
加密的app_sign和 app_key还有时间app_timestamp传到API
但是app_secret不能传过去
params:数据会存在url后面?app_sign=****&app_key=*** """
data_dict = {
'k1':'v1',
'v2':'v2'
}
ret = requests.post(
url='http://127.0.0.1:8000/api/asset2.html',
params={'app_sign': app_sign,"app_key": app_key, 'app_timestamp': app_timestamp},
data=data_dict
)
print(ret.text) def god1():
app_key = 'de3908e1-31c3-4de8-a535-7830cca5a427'
data_dict = {
'k1': 'v1',
'k2': 'v2',
} ret = requests.post(
url='http://127.0.0.1:8000/api/asset.html',
params={'app_key': app_key},
data=data_dict,
) print(ret.text) if __name__ == '__main__':
#god1()
god2()

客户端

Python api认证的更多相关文章

  1. Python开发【Django】:日志记录、API认证

    日志记录: 调用同一个对象,分别记录错误日志和运行日志 自定义日志类: class Logger(object): __instance = None def __init__(self): self ...

  2. API认证&SDK&RESTful

    python API的安全认证   我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户 ...

  3. Django REST framework 之 API认证

    RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...

  4. Appium python API 总结

    Appium python api 根据testerhome的文章,再补充一些文章里面没有提及的API [TOC] [1]find element driver 的方法 注意:这几个方法只能通过sel ...

  5. The novaclient Python API

    The novaclient Python API Usage First create a client instance with your credentials: >>> f ...

  6. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  7. [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。

    1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...

  8. BotVS开发基础—Python API

    代码 import json def main(): # python API列表 https://www.botvs.com/bbs-topic/443 #状态信息 LogStatus(" ...

  9. 《Spark Python API 官方文档中文版》 之 pyspark.sql (一)

    摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...

随机推荐

  1. Java之资源文件读取

    ClassLoaderWrapper.java package org.utils.resource; import java.io.InputStream; import java.net.URL; ...

  2. Java NIO 详解(二)

    异步IO 异步 I/O 是一种没有阻塞地读写数据的方法.通常,在代码进行 read() 调用时,代码会阻塞直至有可供读取的数据.同样, write()调用将会阻塞直至数据能够写入,关于同步的IO请参考 ...

  3. ubuntu 16.04 kdump 使用

    1.安装linux-crashdump及kdump sudo apt-get install linux-crashdump sudo apt-get install kexec-tool 2.重启电 ...

  4. GCD - Extreme (II) UVA - 11426(欧拉函数!!)

    G(i) = (gcd(1, i) + gcd(2, i) + gcd(3, i) + .....+ gcd(i-1, i)) ret = G(1) + G(2) + G(3) +.....+ G(n ...

  5. Mysql(三)约束

    一.视图 视图是虚拟的数据表,本身不存储数据,而是提供数据的逻辑 展示.       1.创建视图 create view stu_view as select s1.id, s1.name, s2. ...

  6. 界面编程之QT的Socket通信20180730

    /*******************************************************************************************/ 一.linu ...

  7. C/S与B/S区别

    1.什么是C/S结构C/S (Client/Server)结构,即客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现, ...

  8. 【CSS】定义元素的位置

    CSS定义元素的位置html元素的position属性,有4个属性值,分别是static.relative.fixed.absolute static: 1.默认值,一般不显式设置为static 2. ...

  9. css3 @keyframes用法

    使用@keyframes规则,可以创建动画. 在动画的过程中,可以多次更改css样式的设定. 对于指定的变化:发生时用0%,或关键字“from”和“to”,这与0%和100%相同. 0%:开头动画. ...

  10. 【1】ConcurrentModificationException 异常解析和快速失败,安全失败

    目录 一.引起异常的代码 二.foreach原理 三.从ArrayList源码找原因 四.单线程解决方案 五.在多线程环境下的解决方法 一.引起异常的代码 以下三种的遍历集合对象时候,执行集合的rem ...