本节内容:

  • 基本的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. 第十周PSP&进度条

    PSP 一.表格: D日期     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月17号 站立会议 分配任务 13:00 13:30 0 3 ...

  2. 顺序表的C、C++实现

    一个线性表表实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数. 1.文件 line_list.h // line_list ...

  3. CUDA ---- GPU架构(Fermi、Kepler)

    GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的. 以Fermi架构为例,其包含以下主要组成部分: CUDA co ...

  4. Django从入门到放弃

    第一篇: web应用 HTTP协议 web框架 第二篇:Djangon简介 第三篇:路由控制 第四篇:视图层 第五篇:模版层 第六篇:模型层:单表操作,多表操作,常用(非常用)字段和参数,Django ...

  5. We Need More Bosses CodeForces - 1000E(缩点 建图 求桥 求直径)

    题意: 就是求桥最多的一条路 解析: 先求连通分量的个数 然后缩点建图  求直径即可 #include <bits/stdc++.h> #define mem(a, b) memset(a ...

  6. Two Bases CodeForces - 602A (BigInteger c++long long也可以)

    哇咔咔 卡函数的 标记一下 c++和java的进制转换函数都是1-36进制的 c++ long long暴力就过了... 自己写一个就好了 import java.math.BigInteger; i ...

  7. in packet sniffer

    in packet sniffer 来源 https://kb.fortinet.com/kb/microsites/search.do?cmd=displayKC&docType=kc&am ...

  8. 【刷题】BZOJ 3944 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  9. 【题解】 P1879 玉米田Corn Fields (动态规划,状态压缩)

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  10. 修改docker镜像和容器的存放路径

    默认情况下,镜像和容器存放的路径是/var/lib/docker. 要修改这个设置很简单,把指定的目录软链到这个目录,或者将一个单独的分区挂载到这个目录,或者直接修改docker启动参数. 查看使用帮 ...