Django-api认证
验证过程:每一个中控机有一个key,然后获取到当前时间戳。把key和当前时间戳这两个值进行一次加密,加密之后得到加密的戳,把加密的戳和当前获取的时间戳用管道符分割开生成一个大的字符串(加密戳|时间戳)后,发到服务器端。服务器端也有一个跟中控机一样的key,再把从客户端传过来的时间戳拿来跟key进行一次加密后做比较确定是否一样。但这种方式有漏洞,假如别人在中间获取了你的url之后就会永远向你发数据,所以在这个基础上加了一个超时时间和访问记录做限制。
a. 时间超时
b. 访问记录
c. 加密后进行比较
~~
(1)URL:django_api\django_api\urls.py
from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')), #以api开头转发到api项目里的url
]
(2)URL:django_api\api\urls.py
from django.conf.urls import url,include
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^asset/', views.asset),
]
(3)视图函数:django_api\api\views.py
#验证了三层:1.时间,2在这个时间以内是否来过,3.反解进行验证
from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect #关掉csrf
import hashlib
import time
ck = "8kasoimnasodn8687asdfkmasdf" auth_list=[] #定义空列表(要用缓存服务器做超时时间) @csrf_exempt #不受csrf保护
def asset(request): #所有请求都封装在request对象里
# print(request.method) #打印接收什么方式提交
# print(request.POST)
# print(request.GET)
# print(request.body) #POST接收json序列化的数据后
auth_key_time = request.META['HTTP_AUTHKEY'] #authkey_time是客户端发来的md5+key十六进制数据字符串值+客户端的时间戳的字符串
auth_key_client,client_ctime = auth_key_time.split('|') #auth_key_client是客户端传md5+key,client_ctime客户端的时间戳的字符串+客户端传的时间戳
server_current_time = time.time() #获取服务器当前时间戳字符串
if server_current_time-5 > float(client_ctime): #服务端当前时间戳往后推300秒还大于客户端发过来的时间戳
return HttpResponse('时间太久远了') #时间太久远了,直接忽略掉
if auth_key_time in auth_list: #如果authkey_time在列表auth_list说明之前访问过了
return HttpResponse('你来晚了')
#如果上面验证成功了下面没成功说明用户自己写了一大堆key
key_time = "%s|%s" %(ck,client_ctime,) #ck:本地的key,客户端传的时间戳
m = hashlib.md5()
m.update(bytes(key_time, encoding='utf-8')) #把md5+key | 当前时间戳加进来
authkey = m.hexdigest() #生成一个md5+key+当前时间戳的字符串 if authkey != auth_key_client: #如果本地的authkey跟客户端发来的auth_key_client不等于
return HttpResponse('授权失败')
auth_list.append(auth_key_time) #验证成功的加到访问过的列表auth_list里
print(auth_list) if request.method == 'POST': #如果接收的是POST方式
import json
host_info = json.loads(str(request.body,encoding='utf-8')) #反序列化
print(host_info)
return HttpResponse('成功')
启动api后等待客户端发数据:
(1)客户端代码:
import requests
import hashlib #md5
import time
current_time = time.time() #当前时间戳
app_id = "8kasoimnasodn8687asdfkmasdf" #key
app_id_time = "%s|%s" %(app_id,current_time,) #拼接成:key | 当前时间戳
m = hashlib.md5() #调用hashlib里的md5()生成一个md5的hash对象赋值m
m.update(bytes(app_id_time,encoding='utf-8')) #用update方法对字符串app_id_time进行md5加密的更新处理
authkey = m.hexdigest() #生成一个md5+key的十六进制数据字符串值 authkey_time = "%s|%s" %(authkey,current_time,) #authkey_time是md5+key十六进制数据字符串值 | 当前时间戳的字符串
print(authkey_time) host_data = { #取的主机信息
'status': True,
'data':{
'hostname': 'c1.com',
'disk': {'status':True,'data': 'xxx'},
'mem': {'status':True,'data': 'xxx'},
}
} response = requests.post( #requests模块以post方式把host_data发http请求,response拿到发送后的返回值(http发送后返回的所有的值)
url='http://127.0.0.1:8080/api/asset/',
json=host_data, #json把字典序列化成字符串后把host_data请求体POST形式传值到body
headers={'authkey': authkey_time} #请求头headers放验证信息:authkeymd5+key+当前时间戳的字符串,authkey_time是md5+key+当前时间戳的字符串 | 当前时间戳的字符串
)
print(response.text) #打印返回的值
执行客户端后服务端接收数据:
['eb7259b288e686c0ad09e3ab8bdf049e|1554365241.2854595']
{'status': True, 'data': {'hostname': 'c1.com', 'mem': {'status': True, 'data': 'xxx'}, 'disk': {'status': True, 'data': 'xxx'}}}
客户端返回:
eb7259b288e686c0ad09e3ab8bdf049e|1554365241.2854595
成功
Django-api认证的更多相关文章
- Python开发【Django】:日志记录、API认证
日志记录: 调用同一个对象,分别记录错误日志和运行日志 自定义日志类: class Logger(object): __instance = None def __init__(self): self ...
- Django REST framework 之 API认证
RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...
- 05: api认证
1.1 api认证原理介绍 1.api认证原理:客户端生成秘钥 1) 客户端与服务器端有一个相同的字符串作为auth_key 2) 客户端使用encryption="auth_key|tim ...
- django 自定义认证
在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...
- DRF比Django的认证和权限高在哪里
Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式.我们通过继续学习官网教程来进行 ...
- [django]用户认证中只允许登陆用户访问(网页安全问题)
当设计一个重要网页时,一般要求未从登陆界面访问的用户不能进入其他页面,那么需要如何设置呢? 如下 django中的url.py urlpatterns = [ url(r'^$', 'login ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
- Django 用户认证及OneToOneField
Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...
- laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证
第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
随机推荐
- js 表格操作(兼容模式
用insertRow,insertRow操作表格时,发现在谷歌浏览器中顺序和IE是反的 // 表格新增行 function addTableRow($id,$arr,$rowAttr){ var ta ...
- git 的安装与初始化
1搭建本地git服务器: 1.1安装git 对于ubuntu系统,一般自带git,可以使用git --version 查看版本号 ,或使用apt-get install git . centos上对 ...
- centos7搭建时间服务器
时区概念 GMT.UTC.CST.DST UTC:整个地球分为二十四个时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时间(UTC:Univers ...
- 读取properties配置文件,value值为中文时出现乱码
已确保idea工具默认设置都是UTF-8格式: 然后在配置类上,指定编码: @PropertySource(value = "classpath:short_message.prop ...
- dev控件 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内
前言 本文主要讲解 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内,顺便附上Float(浮动)的时候使窗体最大化,及指定只能某一个子窗体能浮动放大. 下面进入正题. 一.首 ...
- webdriver的三种时间等待( sleep(); implicitly_wait(); WebDriverWait();)
https://blog.csdn.net/HeatDeath/article/details/71774572 基于<Selenium 2自动化测试实战>的学习笔记(11)—— 设置等待 ...
- 斐讯K2 22.5.9固件刷华硕固件实测教程
斐讯K2最新的固件是V22.5.9.163这个版本是锁死了,不能刷机的,而且不能降级到原来的可以刷机的老版本固件,也就不能刷第三方固件了,怎么破呢?下面就教大家怎么降级刷机到V22.4.2.8固件. ...
- Python机器学习(基础篇---监督学习(集成模型))
集成模型 集成分类模型是综合考量多个分类器的预测结果,从而做出决策. 综合考量的方式大体分为两种: 1.利用相同的训练数据同时搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则作出最终的 ...
- PTA --- 时间复杂度 选择题
1-1 2N和NN具有相同的增长速度. (2分) T F 作者: DS课程组 单位: 浙江大学 1-2 (NlogN)/1000是O(N)的. (1分) T ...
- 第二次scrum冲刺
一.第二次冲刺任务 Scrum是在已有的基础上实现读者查询书籍的功能. 二.用户故事 用户输入账号.密码 用户输入需要查询的书籍 系统显示用户输入的信息的详细信 ...