Python api认证
本节内容:
- 基本的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认证的更多相关文章
- Python开发【Django】:日志记录、API认证
日志记录: 调用同一个对象,分别记录错误日志和运行日志 自定义日志类: class Logger(object): __instance = None def __init__(self): self ...
- API认证&SDK&RESTful
python API的安全认证 我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户 ...
- Django REST framework 之 API认证
RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...
- Appium python API 总结
Appium python api 根据testerhome的文章,再补充一些文章里面没有提及的API [TOC] [1]find element driver 的方法 注意:这几个方法只能通过sel ...
- The novaclient Python API
The novaclient Python API Usage First create a client instance with your credentials: >>> f ...
- Openstack python api 学习文档 api创建虚拟机
Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
- BotVS开发基础—Python API
代码 import json def main(): # python API列表 https://www.botvs.com/bbs-topic/443 #状态信息 LogStatus(" ...
- 《Spark Python API 官方文档中文版》 之 pyspark.sql (一)
摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...
随机推荐
- Oracle 最新版本变化 转帖
版本更迭 http://www.sohu.com/a/163264045_505827 Oracle Database的下一个版本将是 Oracle 18. 目的 为了更快的.通过每年的版本发布将新特 ...
- Delphi cxGrid加行号
procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo; ...
- 【版本管理】自定义git
Git除了可配置user.name和user.email外,实际上,Git还有很多可配置项. 如 $ git config --global color.ui true,让Git显⽰示颜⾊色,会让命令 ...
- BZOJ2743 HEOI2012采花(离线+树状数组)
如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...
- Antenna Placement POJ - 3020 (最小边集覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10699 Accepted: 526 ...
- tomcat Failed creating java C:\Program Files\Java\jre6\bin\client\jvm.dll %1 不是有效的 Win32 应用程序。
jdk版本搞的鬼 请下载64位的jdkj进行安装
- GDOI2018 Day1 题目总结
T1:农场 题意:有一个长为 $n$ 的序列 $a$,要求将其分成尽可能多的部分,使得每一部分的 $a_i$ 的和相等.求最多能分成的部分数. $30\%:1\le n\le 1000$ $80\%: ...
- 解析word公式的解决方案(office插入和wps插入不同的解决方案)
这几天在公司的项目有个需求就是数学公式的导入,而对于word来说,插入的公式xml格式,需要转换为mathML,借用插件MathJax来进行展示,而对于wps插入的公式来说,获取到的是一个wmf图片, ...
- Android Service总结05 之IntentService
Android Service总结05 之IntentService 版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...
- dwr框架介绍
转: [DWR框架]过时了吗? 置顶 2018年06月02日 11:59:02 许你笑颜 阅读数:4129 版权声明: https://blog.csdn.net/smileyan9/articl ...