Răsfoiți Sursa

添加两个表

pengzhibo168 5 ani în urmă
părinte
comite
f24593e404
5 a modificat fișierele cu 218 adăugiri și 10 ștergeri
  1. 4 4
      Ansjer/local_settings.py
  2. 3 1
      Ansjer/urls.py
  3. 119 0
      Controller/ApplicationController.py
  4. 66 3
      Model/models.py
  5. 26 2
      Service/CommonService.py

+ 4 - 4
Ansjer/local_settings.py

@@ -77,10 +77,10 @@ DATABASE_DATA = 'AnsjerLocal'
 SERVER_HOST = '192.168.136.45'
 DATABASES_USER = 'ansjer'
 DATABASES_PASS = 'ansjer.x.x'
-# DATABASE_DATA = 'AnsjerLocal'
-# SERVER_HOST = 'localhost'
-# DATABASES_USER = 'root'
-# DATABASES_PASS = '123456'
+DATABASE_DATA = 'AnsjerLocal'
+SERVER_HOST = 'localhost'
+DATABASES_USER = 'root'
+DATABASES_PASS = '123456'
 DATABASES = {'default': {
     'ENGINE': 'django.db.backends.mysql',
     'NAME': DATABASE_DATA,

+ 3 - 1
Ansjer/urls.py

@@ -7,7 +7,8 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     EquipmentManager, LogManager, PermissionManager, OTAEquipment, shareUserPermission, UidSetController, \
     UserManger, CheckUserData, \
     UserController, CloudVod, OrderContrller, VodBucket, DetectController, DeviceShare, UserBrandController, \
-    StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2, PushDeploy, AppSetController
+    StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2, PushDeploy, AppSetController,\
+    ApplicationController
 
 urlpatterns = [
     url(r'^account/authcode$', UserController.authCodeView.as_view()),
@@ -177,6 +178,7 @@ urlpatterns = [
     url(r'^oalexa/discoveryuid', UserController.alexaUidView.as_view()),
 
     url(r'^appset/(?P<operation>.*)$', AppSetController.AppSetView.as_view()),
+    url(r'^login/oauth/(?P<operation>.*)$', ApplicationController.ApplicationView.as_view()),
 
     # app 设备消息模板
     # 路由加参数参考

+ 119 - 0
Controller/ApplicationController.py

@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD019
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2020/3/18 9:38
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: AppSetController.py
+@Contact: pzb3076@163.com
+"""
+import requests
+from Ansjer.config import SERVER_TYPE
+from Model.models import ApplicationModel
+from django.views.generic.base import View
+from Object.RedisObject import RedisObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from django.http import JsonResponse
+from django.contrib import auth
+import time,json
+from Object.ResponseObject import ResponseObject
+    # http://192.168.136.39:8000/login/oauth/authorize
+class ApplicationView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        return self.validation(request.GET, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        return self.validation(request.POST, operation)
+
+    def validation(self, request_dict, operation):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        if tko.code != 0:
+            userID = tko.userID
+            if operation == 'authorize':
+                return self.do_authorize(request_dict, userID, response)
+            elif operation == 'access_token':
+                return self.do_token(request_dict, userID, response)
+            elif operation == 'user':
+                return self.do_user(request_dict, userID, response)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(414)
+
+    def do_authorize(self,request_dict, userID, response):
+        state = request_dict.get("state", '')
+        client_id = request_dict.get("client_id", '')
+        response_type = request_dict.get("response_type", '')
+        scope = request_dict.get("scope", '')
+        redirect_uri = request_dict.get("redirect_uri", '')
+        code = CommonService.encrypt_data(32)
+        print(redirect_uri)
+        redirect_uri = redirect_uri + '?code=' + code + '&state=' + state
+        return response.json(0, res=redirect_uri)
+
+        # 增加对code和client_id的校验代码,返回access_token和refresh_token
+    def do_token(self,request_dict, userID, response):
+        code = request_dict.get("code", None)
+        client_id = request_dict.get("client_id", None)
+        refresh_token = request_dict.get("refresh_token", None)
+        print('refresh_token:')
+        print(refresh_token)
+        print('code:')
+        print(code)
+        print('client_id:')
+        print(client_id)
+        access_token = CommonService.encrypt_data(randomlength=32)
+        refresh_token = CommonService.encrypt_data(randomlength=32)
+        res_json = {
+            "access_token": access_token,
+            "token_type": "bearer",
+            "expires_in": 3600,
+            "refresh_token": refresh_token
+        }
+        print(res_json)
+        return JsonResponse(res_json)
+
+    def do_user(self, request_dict, userID, response):
+        code = request_dict.get("code", None)
+        client_id = request_dict.get("client_id", None)
+        refresh_token = request_dict.get("refresh_token", None)
+        print('refresh_token:')
+        print(refresh_token)
+        print('code:')
+        print(code)
+        print('client_id:')
+        print(client_id)
+        access_token = CommonService.encrypt_data(randomlength=32)
+        refresh_token = CommonService.encrypt_data(randomlength=32)
+        res_json ={
+          "login": "pengzhibo168",
+          "id": 1,
+          "node_id": "MDQ6VXNlcjE=",
+          "gravatar_id": "",
+          "type": "User",
+          "name": "monalisa octocat",
+          "company": "asdfda",
+          "location": "San Francisco",
+          "email": "sadf@sadf.com",
+          "bio": "There once was...",
+          "public_repos": 2,
+          "public_gists": 1,
+          "followers": 20,
+          "following": 0,
+          "created_at": "2008-01-14T04:33:35Z",
+          "updated_at": "2008-01-14T04:33:35Z"
+        }
+        print(res_json)
+        return JsonResponse(res_json)

+ 66 - 3
Model/models.py

@@ -1,5 +1,5 @@
 from itertools import chain
-
+from Service.CommonService import CommonService
 from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
 from django.db import models
 from django.utils import six
@@ -646,7 +646,7 @@ class UidSetModel(models.Model):
     resetTime = models.IntegerField(default=0, verbose_name='设备重置时间')
     is_alexa = models.IntegerField(default=0, verbose_name='会否支持alexa') # 0:否,1:是
     # is_azpush = models.IntegerField(default=0, verbose_name='会否自家推送服务') # 0:否,1:是
-
+    detect_group = models.CharField(default='', max_length=10, verbose_name=u'检测类型')
     class Meta:
         db_table = 'uid_set'
         verbose_name = u'设备配置表'
@@ -784,4 +784,67 @@ class AppSetModel(models.Model):
         db_table = 'app_set'
         verbose_name = 'app的各个版本控制表'
         verbose_name_plural = verbose_name
-        ordering = ('-id',)
+        ordering = ('-id',)
+
+# 认证客户端类型表
+
+class ApplicationModel(models.Model):
+    CLIENT_TYPES = (
+        ('confidential', 'confidential'),
+        ('public', 'public'),
+    )
+    # authorization_code
+    # 授权码模式(即先登录获取code, 再获取token)
+    # password
+    # 密码模式(将用户名, 密码传过去, 直接获取token)
+    # client_credentials
+    # 客户端模式(无用户, 用户向客户端注册, 然后客户端以自己的名义向’服务端’获取资源)
+    # implicit
+    # 简化模式(在redirect_uri
+    # 的Hash传递token;
+    # Auth客户端运行在浏览器中, 如JS, Flash)
+    # refresh_token
+    # 刷新access_token
+    GRANT_TYPES = (
+        ('authorization_code', "authorization_code"),
+        ('password', "password"),
+        ('client_credentials', "client_credentials"),
+        ('implicit', "implicit"),
+        ('refresh_token', "refresh_token"),
+    )
+    id = models.BigAutoField(primary_key=True)
+    name = models.CharField(max_length=255, blank=True, verbose_name='client名字描述')
+    client_id = models.CharField(max_length=50, unique=True, default=CommonService.generate_token(),
+                                 verbose_name='客户端id')
+    client_secret = models.CharField(max_length=50, unique=True, default=CommonService.generate_token(),
+                                     verbose_name='客户端secret')
+    client_type = models.CharField(max_length=32, choices=CLIENT_TYPES, verbose_name='客户端类型')
+    grant_type = models.CharField(max_length=32, choices=GRANT_TYPES,blank=True,null=True)
+    redirect_urls = models.TextField(blank=True, null=True, verbose_name='重定向url')
+    skip_auth = models.BooleanField(default=False, verbose_name='是否跳过点击授权')
+    add_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')
+    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
+
+    class Meta:
+        ordering = ('-add_time',)
+        verbose_name = u'可授权客户端表'
+        db_table = 'oauth_application'
+
+# 授权码信息表
+class GrantCodeModel(models.Model):
+    id = models.BigAutoField(primary_key=True)
+    userID = models.ForeignKey(Device_User, verbose_name="用户表userID", to_field='userID', on_delete=models.CASCADE)
+    code = models.CharField(max_length=32, unique=True)
+    application = models.ForeignKey(ApplicationModel, on_delete=models.CASCADE)
+    expire_time = models.DateTimeField(verbose_name='过期时间')
+    add_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')
+    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
+
+    # 输出的永远是本地时间输出的永远是本地时间
+    def is_expired(self):
+        return timezone.now() >= self.expire_time
+
+    class Meta:
+        ordering = ('-add_time',)
+        verbose_name = u'授权码表'
+        db_table = 'oauth_grant_code'

+ 26 - 2
Service/CommonService.py

@@ -8,8 +8,8 @@ import simplejson as json
 from django.core import serializers
 from django.utils import timezone
 from pyipip import IPIPDatabase
-
-from Ansjer.config import BASE_DIR
+from secrets import SystemRandom
+from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET
 
 
 # 复用性且公用较高封装代码在这
@@ -199,3 +199,27 @@ class CommonService:
             n_time = n_time + 3600 * float(tz)
         n_date = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(int(n_time)))
         return n_date
+
+        # 生成随机client_id, client_secret
+
+    @staticmethod
+    def generate_token(length=40, chars=UNICODE_ASCII_CHARACTER_SET):
+        rand = SystemRandom()
+        return ''.join(rand.choice(chars) for x in range(length))
+
+    # 生成随机数
+    @staticmethod
+    def encrypt_data(randomlength=8, number=False):
+        str = ''
+        if number == False:
+            characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
+                           'tUuVvWwXxYyZz0123456789'
+        else:
+            characterSet = '0123456789'
+
+        length = len(characterSet) - 1
+
+        random = Random()
+        for index in range(randomlength):
+            str += characterSet[random.randint(0, length)]
+        return str