码迷,mamicode.com
首页 > 数据库 > 详细

Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

时间:2018-06-24 20:58:42      阅读:823      评论:0      收藏:0      [点我收藏+]

标签:this   sed   cli   IV   列表   dig   bec   sid   object   

技术分享图片

 

技术分享图片
  1 #settings.py
  2 """
  3 Django settings for AutoCmdb project.
  4 
  5 Generated by ‘django-admin startproject‘ using Django 2.0.6.
  6 
  7 For more information on this file, see
  8 https://docs.djangoproject.com/en/2.0/topics/settings/
  9 
 10 For the full list of settings and their values, see
 11 https://docs.djangoproject.com/en/2.0/ref/settings/
 12 """
 13 
 14 import os
 15 
 16 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 17 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 18 
 19 
 20 # Quick-start development settings - unsuitable for production
 21 # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
 22 
 23 # SECURITY WARNING: keep the secret key used in production secret!
 24 SECRET_KEY = 35d18e6vmo0k*xg#h=&kuer*t3a#@hv09@@kvz@=dd@dzw&!7w
 25 
 26 # SECURITY WARNING: don‘t run with debug turned on in production!
 27 DEBUG = True
 28 
 29 ALLOWED_HOSTS = []
 30 
 31 
 32 # Application definition
 33 
 34 INSTALLED_APPS = [
 35     django.contrib.admin,
 36     django.contrib.auth,
 37     django.contrib.contenttypes,
 38     django.contrib.sessions,
 39     django.contrib.messages,
 40     django.contrib.staticfiles,
 41     api.apps.ApiConfig,
 42 ]
 43 
 44 MIDDLEWARE = [
 45     django.middleware.security.SecurityMiddleware,
 46     django.contrib.sessions.middleware.SessionMiddleware,
 47     django.middleware.common.CommonMiddleware,
 48     django.middleware.csrf.CsrfViewMiddleware,
 49     django.contrib.auth.middleware.AuthenticationMiddleware,
 50     django.contrib.messages.middleware.MessageMiddleware,
 51     django.middleware.clickjacking.XFrameOptionsMiddleware,
 52 ]
 53 
 54 ROOT_URLCONF = AutoCmdb.urls
 55 
 56 TEMPLATES = [
 57     {
 58         BACKEND: django.template.backends.django.DjangoTemplates,
 59         DIRS: [],
 60         APP_DIRS: True,
 61         OPTIONS: {
 62             context_processors: [
 63                 django.template.context_processors.debug,
 64                 django.template.context_processors.request,
 65                 django.contrib.auth.context_processors.auth,
 66                 django.contrib.messages.context_processors.messages,
 67             ],
 68         },
 69     },
 70 ]
 71 
 72 WSGI_APPLICATION = AutoCmdb.wsgi.application
 73 
 74 
 75 # Database
 76 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
 77 
 78 DATABASES = {
 79     default: {
 80         ENGINE: django.db.backends.sqlite3,
 81         NAME: os.path.join(BASE_DIR, db.sqlite3),
 82     }
 83 }
 84 
 85 
 86 # Password validation
 87 # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
 88 
 89 AUTH_PASSWORD_VALIDATORS = [
 90     {
 91         NAME: django.contrib.auth.password_validation.UserAttributeSimilarityValidator,
 92     },
 93     {
 94         NAME: django.contrib.auth.password_validation.MinimumLengthValidator,
 95     },
 96     {
 97         NAME: django.contrib.auth.password_validation.CommonPasswordValidator,
 98     },
 99     {
100         NAME: django.contrib.auth.password_validation.NumericPasswordValidator,
101     },
102 ]
103 
104 
105 # Internationalization
106 # https://docs.djangoproject.com/en/2.0/topics/i18n/
107 
108 LANGUAGE_CODE = en-us
109 
110 TIME_ZONE = UTC
111 
112 USE_I18N = True
113 
114 USE_L10N = True
115 
116 USE_TZ = True
117 
118 
119 # Static files (CSS, JavaScript, Images)
120 # https://docs.djangoproject.com/en/2.0/howto/static-files/
121 
122 STATIC_URL = /static/
123 
124 TEMPLATE_DIRS = (os.path.join(BASE_DIR,  templates),)
125 
126 # ————————03CMDB信息安全API接口交互认证————————
127 ASSET_AUTH_KEY = 299095cc-1330-11e5-b06a-a45e60bec08b #认证的密码
128 ASSET_AUTH_TIME = 2  #认证的有效时间 #2秒
129 # ————————03CMDB信息安全API接口交互认证————————
#settings.py

 

技术分享图片

 

技术分享图片

 

技术分享图片
 1 # auth.py
 2 # ————————03CMDB信息安全API接口交互认证————————
 3 import time #时间模块
 4 import hashlib #哈希值
 5 from AutoCmdb.settings import ASSET_AUTH_KEY   #认证的密码
 6 from AutoCmdb.settings import ASSET_AUTH_TIME  #认证的有效时间
 7 from django.http import JsonResponse  #这个类是HttpRespon的子类
 8 
 9 ENCRYPT_LIST = [
10     # {‘encrypt‘: encrypt, ‘time‘: timestamp
11 ] #已认证的密码列表
12 
13 def api_auth_method(request):
14     auth_key = request.META.get(HTTP_AUTH_KEY)#获取(META)元素 #‘时间密码’和 时间戳
15     print(‘时间密码’和 时间戳:,auth_key)
16     if not auth_key: #没有获取到值 就 #返回认证不通过
17         return False
18     sp = auth_key.split(|) # split()通过指定分隔符对字符串进行切片
19     if len(sp) != 2: #如果切片后的字符串 是2个 就 #返回认证不通过
20         return False
21     encrypt, timestamp = sp  #给切片后的2个字符串 各设置一个变量
22     timestamp = float(timestamp)  #float() 函数用于将整数和字符串转换成浮点数。
23     limit_timestamp = time.time() - ASSET_AUTH_TIME  #设定服务器的时间戳
24     print(比较时间戳,limit_timestamp, timestamp)
25     if limit_timestamp > timestamp: #如果服务器的时间戳大于客户端的时间戳 就 #返回认证不通过
26         return False
27     #和客户端一样进行哈希加密
28     ha = hashlib.md5(ASSET_AUTH_KEY.encode(utf-8)) #认证的密码
29     ha.update(bytes("%s|%f" % (ASSET_AUTH_KEY, timestamp), encoding=utf-8))#更新认证密码#密码+时间戳
30     result = ha.hexdigest() # 对‘时间密码’进行哈希
31     print(对比认证值:,result,encrypt)
32     if encrypt != result:#比较客户端哈希后的值和服务器哈希后的值是不是一样
33         return False#不一样就 #返回认证不通过
34     exist = False #是否认证过#标志位
35     del_keys = []
36     print(是否认证过,防止黑客:,ENCRYPT_LIST)
37     for k, v in enumerate(ENCRYPT_LIST):#enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
38         print(下标:,k,认证过的值和时间:, v)
39         m = v[time]   #已认证的密码列表 (#客户端的时间戳)
40         n = v[encrypt]   #已认证的密码列表( #客户端哈希后的值)
41         if m < limit_timestamp:#已认证的密码列表(#客户端的时间戳) #小于 #服务器的时间戳
42             del_keys.append(k) #添加下标到  del_keys 列表
43             continue  #退出循环
44         if n == encrypt:  #已认证的密码列表 #等于#客户端哈希后的值
45             exist = True#已认证  #标志位
46     for k in del_keys: #已经判断过的就删除 #客户端哈希后的值#客户端的时间戳
47         del ENCRYPT_LIST[k]  #已认证的密码列表 #删除下标对应的值
48     if exist: #已认证 #标志位
49         return False  #返回认证不通过
50     ENCRYPT_LIST.append({encrypt: encrypt, time: timestamp})#客户端哈希后的值#客户端的时间戳
51     return True   #返回认证通过
52 
53 def api_auth(func):
54     def inner(request, *args, **kwargs):
55         if not api_auth_method(request): # 如果 return False  #返回认证不通过
56             print("{‘code‘: 1001, ‘message‘: ‘API授权失败‘}")
57             return JsonResponse({code: 1001, message: API授权失败}, json_dumps_params={ensure_ascii: False})
58         return func(request, *args, **kwargs) #  如果   return True   #返回认证通过
59     return inner #执行#def inner(request, *args, **kwargs):
60 # ————————03CMDB信息安全API接口交互认证————————
# auth.py

 

技术分享图片

 

技术分享图片
 1 from django.shortcuts import render
 2 
 3 # Create your views here.
 4 
 5 # views.py
 6 # ————————03CMDB信息安全API接口交互认证————————
 7 from utils import auth
 8 # ————————03CMDB信息安全API接口交互认证————————
 9 
10 # ————————02CMDB将服务器基本信息提交到API接口————————
11 import json #轻量级的文本数据交换格式
12 from django.views import View
13 from django.views.decorators.csrf import csrf_exempt #和HTML的{% csrf_token %}作用一样
14 from django.utils.decorators import method_decorator #安全通过 ‘django.middleware.csrf.CsrfViewMiddleware‘,
15 from django.http import JsonResponse#这个类是HttpRespon的子类
16 class AssetView(View):# http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]
17     @method_decorator(csrf_exempt)#和HTML的{% csrf_token %}作用一样,安全通过 ‘django.middleware.csrf.CsrfViewMiddleware‘,
18     def dispatch(self, request, *args, **kwargs):
19         return super(AssetView, self).dispatch(request, *args, **kwargs)
20 
21     # ————————03CMDB信息安全API接口交互认证————————
22     @method_decorator(auth.api_auth) #装饰器
23     # ————————03CMDB信息安全API接口交互认证————————
24     def post(self, request, *args, **kwargs):#接受客户端到信息
25         server_info = json.loads(request.body.decode(utf-8))
26         print(获取到的信息: ,type(server_info),server_info)
27         server_info = json.loads(server_info)#把字符串转换成字典
28         print(转换后的信息: ,type(server_info),server_info)
29         hostname = server_info[hostname]
30         print(主机名,hostname)
31         ret = {code: 1000, message: [%s]更新完成 % hostname}#返回到客户端到信息
32         print(ret)
33         return JsonResponse(ret)#这个类是HttpRespon的子类
34 # ————————02CMDB将服务器基本信息提交到API接口————————
# views.py

 

 


 

 

技术分享图片

 

技术分享图片
 1 #settings.py
 2 # ————————01CMDB获取服务器基本信息————————
 3 import os
 4 
 5 BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))##当前路径
 6 
 7 # 采集资产的方式,选项有:agent(默认), salt, ssh
 8 MODE = agent
 9 
10 # ————————01CMDB获取服务器基本信息————————
11 
12 # ————————02CMDB将服务器基本信息提交到API接口————————
13 # 资产信息API
14 ASSET_API = "http://127.0.0.1:8000/api/asset"
15 # ————————02CMDB将服务器基本信息提交到API接口————————
16 
17 # ————————03CMDB信息安全API接口交互认证————————
18 # 用于API认证的KEY
19 KEY = 299095cc-1330-11e5-b06a-a45e60bec08b #认证的密码
20 # 用于API认证的请求头
21 AUTH_KEY_NAME = auth-key
22 # ————————03CMDB信息安全API接口交互认证————————
#settings.py

 

 

技术分享图片

 

技术分享图片

 

技术分享图片
 1 # client.py
 2 # ————————01CMDB获取服务器基本信息————————
 3 from src import plugins  #__init__.py
 4 from lib.serialize import Json #转成字符串或者模式
 5 
 6 # ————————02CMDB将服务器基本信息提交到API接口————————
 7 import requests  #伪造页面访问
 8 from config import settings #文件配置
 9 # ————————02CMDB将服务器基本信息提交到API接口————————
10 
11 # ————————03CMDB信息安全API接口交互认证————————
12 import hashlib
13 import time
14 # ————————03CMDB信息安全API接口交互认证————————
15 
16 class AutoBase(object):
17 
18     # ————————02CMDB将服务器基本信息提交到API接口————————
19     def __init__(self):
20         self.asset_api = settings.ASSET_API  #ASSET_API = "http://127.0.0.1:8000/api/asset"
21 
22         # ————————03CMDB信息安全API接口交互认证————————
23         self.key = settings.KEY  # 用于API认证的KEY#KEY = ‘299095cc-1330-11e5-b06a-a45e60bec08b‘
24         self.key_name = settings.AUTH_KEY_NAME  # ‘auth-key‘  API认证的请求头
25         # ————————03CMDB信息安全API接口交互认证————————
26 
27     # ————————03CMDB信息安全API接口交互认证————————
28     def auth_key(self):#API接口认证
29         ha = hashlib.md5(self.key.encode(utf-8))#认证的密码
30         time_span = time.time() #现在的时间戳 #1529819687.8867188
31         ha.update(bytes("%s|%f" % (self.key, time_span), encoding=utf-8))#更新认证密码#密码+时间戳
32         encryption = ha.hexdigest()  # 对‘时间密码’进行哈希
33         result = "%s|%f" % (encryption, time_span) #把‘时间密码’和 时间戳(解密用)  作为 API认证的请求头
34         print(‘时间密码’和 时间戳:,result)
35         return {self.key_name: result}  # ‘auth-key‘ API认证的请求头
36     # ————————03CMDB信息安全API接口交互认证————————
37 
38     def post_asset(self, msg):#post方式向API接口提交资产信息
39         status = True#是否获取到信息
40         try:
41             # ————————03CMDB信息安全API接口交互认证————————
42             headers = {}
43             headers.update(self.auth_key())##认证的密码
44             # ————————03CMDB信息安全API接口交互认证————————
45             response = requests.post(
46                 url=self.asset_api,
47                 # ————————03CMDB信息安全API接口交互认证————————
48                 headers=headers,
49                 # ————————03CMDB信息安全API接口交互认证————————
50                 json=msg
51             )
52         except Exception as e:
53             response = e
54             status = False  #获取信息时出现错误
55         print(response.json())
56     # ————————02CMDB将服务器基本信息提交到API接口————————
57 
58     def process(self):#派生类需要继承此方法,用于处理请求的入口
59         raise NotImplementedError(您必须实现过程的方法)
60 
61 class AutoAgent(AutoBase):
62     def process(self):
63         server_info = plugins.get_server_info()#获取本地基本信息
64         server_json = Json.dumps(server_info.data)#json.dumps将 Python 对象编码成 JSON 字符串
65         print(提交资产信息:,server_json)
66 # ————————01CMDB获取服务器基本信息————————
67 
68         # ————————02CMDB将服务器基本信息提交到API接口————————
69         self.post_asset(server_json)# post方式向接口提交资产信息
70         # ————————02CMDB将服务器基本信息提交到API接口————————
# client.py

 


 

 

技术分享图片

 

技术分享图片

 

Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

标签:this   sed   cli   IV   列表   dig   bec   sid   object   

原文地址:https://www.cnblogs.com/ujq3/p/9221377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!