api安全认证

三、auth自定义授权

客户端代码:

import requests
import hashlib
import time

current_time = time.time()
#自意义的字符串app_id,和服务端ck一致
app_id =‘8kasoimnasodn8687asdfkmasdf‘
app_id_time = "%s|%s" % (app_id,current_time,)

m = hashlib.md5()
m.update(bytes(app_id_time,encoding=‘utf-8‘))
authkey = m.hexdigest()

authkey_time ="%s|%s" % (authkey,current_time,)
print(authkey_time)

host_data = {
    ‘status‘:True,
    ‘data‘:{
        ‘hostname‘:‘c1.com‘,
        ‘disk‘:{‘status‘:True,‘data‘:‘xxx‘},
        ‘mem‘:{‘status‘:True,‘data‘:‘xxx‘},
        ‘nic‘:{‘status‘:True,‘data‘:‘xxx‘},
    },
}

response=requests.post(
    url=‘http://127.0.0.1:8000/api/asset/‘,
    json=host_data,
    headers={‘authkey‘:authkey_time},
)

print(response.text)

# requests.get(url=‘http://127.0.0.1:8000/api/asset/?k1=123‘)
# requests.get(url=‘http://127.0.0.1:8000/api/asset/‘,params={‘k1‘:‘v1‘,‘k2‘:‘v2‘})
# requests.post(
#     url=‘http://127.0.0.1:8000/api/asset/‘,
#     params={‘k1‘:‘v1‘,‘k2‘:‘v2‘}, # GET形式传值
#     data={‘username‘:‘1123‘,‘pwd‘: ‘666‘}, # POST形式传值
#     headers={‘a‘:‘123‘} # 请求头数据
# )

服务端代码:

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect
import hashlib
import time

#自定义的字符串
ck=‘8kasoimnasodn8687asdfkmasdf‘
#5秒钟的授权列表
auth_list = []

@csrf_exempt
def asset(request):
    auth_key_time = request.META.get(‘HTTP_AUTHKEY‘)
    auth_key_client,client_ctime = auth_key_time.split(‘|‘)
    server_current_time = time.time()
    if server_current_time - 5 > float(client_ctime):
        #太久远了
        return HttpResponse(‘时间太久远了‘)
    if auth_key_time in auth_list:
        #已经访问过了
        return HttpResponse(‘你来晚了‘)
    key_time = ‘%s|%s‘ %(ck,client_ctime)
    m = hashlib.md5()
    m.update(bytes(key_time,encoding=‘utf-8‘))
    authkey = m.hexdigest()

    if authkey != auth_key_client:
        return HttpResponse(‘授权失败‘)
    auth_list.append(auth_key_time)

    if request.method == ‘POST‘:
        import json
        print(authkey)
        host_info = json.loads(str(request.body,encoding=‘utf-8‘))
        print(host_info)
    return HttpResponse(‘授权成功‘)

def test(request):
    # print(request.POST,type(request.POST))
    # from django.http.request import QueryDict
    response = render(request,‘index.html‘)
    response.set_signed_cookie(‘kkkk‘,‘vvvv‘,salt=‘asdf‘)
    return response

线程池和进程池

#!/usr/bin/env python
# -*- coding:utf8 -*-

#######  编写方式一  ##########

from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
import requests
import time

def task(url):
    response = requests.get(url)
    print(url,response)

pool = ThreadPoolExecutor(5)

url_list = [
    ‘https://www.baidu.com‘,
    ‘http://www.sina.com.cn‘,
    ‘http://cn.bing.com‘,
    ‘https://home.cnblogs.com/u/liaoboshi/‘,
    ‘https://www.linkedin.com‘,
    ‘http://mil.news.baidu.com‘,
]

for url in url_list:
    pool.submit(task,url)

pool.shutdown(wait=True)

#######  编写方式一  ################################

from concurrent.futures import ThreadPoolExecutor
import requests
import time

def task(url):
    ‘‘‘
     下载页面
    :param url:
    :return:
    ‘‘‘
    response = requests.get(url)
    return response

def done(future,*args,**kwargs):
    response = future.result()
    print(response.status_code,response.content)

pool = ThreadPoolExecutor(5)

url_list = [
    ‘https://www.baidu.com‘,
    ‘http://www.sina.com.cn‘,
    ‘http://cn.bing.com‘,
    ‘https://home.cnblogs.com/u/liaoboshi/‘,
    ‘https://www.linkedin.com‘,
    ‘http://mil.news.baidu.com‘,
]

for url in url_list:
    v = pool.submit(task,url)
    # 每一个线程函数走完,再走下面的另一个回调函数
    v.add_done_callback(done)

pool.shutdown(wait=True)

自定义异步IO框架

#!/usr/bin/env python
# -*- coding:utf8 -*-

# IO多路复用: 监听多个socket对象,感知变化,利用其特性可以并发出异步IO模块
# 异步IO: 异步是非阻塞  非阻塞 + IO多路复用
                    # setblocking(False)

import select
import socket

class HttpRequest:
    def __init__(self,sk,host,callback):
        self.socket = sk
        self.host = host
        self.callback = callback

    def fileno(self):
        return self.socket.fileno()

class HttpResponse:
    def __init__(self,recv_data):
        self.recv_data = recv_data
        self.header_dict = {}
        self.body = None

        self.initialize()

    def initialize(self):
        headers, body = self.recv_data.split(b‘\r\n\r\n‘, 1)
        self.body = body
        header_list = headers.split(b‘\r\n‘)
        for h in header_list:
            h_str = str(h, encoding=‘utf-8‘)
            v = h_str.split(‘:‘, 1)
            if len(v) == 2:
                self.header_dict[v[0]] = v[1]

class AsyncRequest:
    def __init__(self):
        self.conn = []
        self.connection = []   # 用于检测是否已经连接成功

    def add_request(self,host,callback):
        try:
            sk = socket.socket()   # 创建 socket 对象
            sk.setblocking(False)  # 设置socket为非阻塞
            sk.connect((host,80,)) # 连接 主机

        except BlockingIOError as e:  # 设置socket为非阻塞后,会报错,要抓住异常
            pass

        request = HttpRequest(sk,host,callback)  # 创建一个socket对象 要返回self.socket.fileno()
        self.conn.append(request)     # 把对象加到列表里
        self.connection.append(request)  # 把对象加到列表里

    def run(self):

        while True:
            rlist,wlist,elist = select.select(self.conn,self.connection,self.conn,0.05)   # 创建select对象
            for w in wlist:
                print(w.host,‘连接成功...‘)
                # 只要能循环到,表示socket和服务器端已经连接成功
                tpl = ‘GET / HTTP/1.0\r\nHost:%s\r\n\r\n‘ % w.host
                w.socket.send(bytes(tpl,encoding=‘utf8‘))     # 给发服务器送消息
                self.connection.remove(w)   # 发送完消息后,删除对象
            for r in rlist:
                # r,是HttpRequest
                recv_data = bytes()
                while True:
                    try:
                        chunck = r.socket.recv(8096)  # 接收服务器返回消息
                        recv_data += chunck
                    except Exception as e:
                        break

                response = HttpResponse(recv_data) # 返回的消息包装成字典(请求头和请求体)
                r.callback(response)  # 执行回调函数
                r.socket.close()  # 关闭连接
                self.conn.remove(r)   #删除对象
            if len(self.conn) == 0:
                break

def f1(response):  # 回调函数拿到返回的请求头和请求体
    print(‘保存到文件‘, response.header_dict)

def f2(response):
    print(‘保存到数据库‘, response.header_dict)

url_list = [
    {‘host‘: ‘www.baidu.com‘, ‘callback‘: f1},
    {‘host‘: ‘cn.bing.com‘, ‘callback‘: f2},
    {‘host‘: ‘www.cnblogs.com‘, ‘callback‘: f2},
]

req = AsyncRequest() # 创建一个对象

for item in url_list:
    req.add_request(item[‘host‘],item[‘callback‘])  # 运行类的add_request方法,把 主机名 和 回调函数 传进去

req.run() # 运行类的run方法

自定义异步IO框架

时间: 2024-08-25 22:04:40

api安全认证的相关文章

Web APi之认证

Web APi之认证(Authentication)两种实现方式后续[三](十五) 前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络还是知其所以然,所以也无关紧要,停止学习以及分享是一件很痛苦的事情,心情很忐忑也很担忧,那么多牛逼的人都在无时无刻的学习更何况是略懂皮毛的我呢?好了,废话说了不少,我们接下来进入主题. 话题 看到博客也有对于我最近有

Web API之认证(Authentication)两种实现方式【二】(十三)

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)或者在Web API里通过使用Web API中的消息处理机制,但是如果我们想应用程序运行在IIS之外此时Win

Web Api 2 认证与授权 2

HTTP Message Handler 在 Web Api 2 认证与授权 中讲解了几种实现机制,本篇就详细讲解 Message Handler 的实现方式 关于 Message Handler 在 request 到 response 过程所处于的位置,可以参考这里 HTTP Message Handlers Authentication Message Handler 先看一段实现的代码,然后再做讲解,完整代码可以在 Github 上参考,WebApi2.Authentication 1

RESTful Api 身份认证安全性设计

REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 HTTP 请求的 Method  之中. 详情可以阅读 http://mengkang.net/620.html . 而这篇文章则主要是讨论 RESTful Api 身份认证安全性设计. 没有绝对的安全,这个话题很深, 下文都是自己的一些理解,水平有限,如有勘误,希望大家予以指正. 由于 RESTfu

[转]Web APi之认证(Authentication)两种实现方式【二】(十三)

本文转自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)

最安全的api接口认证

最安全的api接口认证 实现步骤: 1.客户端与服务器都存放着用于验证的Token字段,客户端在本地把自己的 用户名+时间戳+Token 组合进行MD5加密后生成一段新的md5-token. 2.客户端访问的时候携带:用户名.时间戳.md5-token. 3.服务端收到请求后,先判断用户名.时间戳是否合法.假设先判断发送过来的时间戳和现在的时间戳不能大于2分钟. 4.如果是在2分钟之内,到redis里查看有没有该用户为key对应的md5-token,并判断它和发送过来的md5-token是否相同

API 双方认证探讨

开放 api 已是大势所趋.而 api 这种东西有个特点就是覆水难收.一旦公开出去了,被大量用户使用,一旦修改,就会让广大用户都掉坑里.所以,api 在设计之初就要尽量考虑周全,并预留扩展可能. 目前绝大多数 api 都是通过 http 协议访问.api 一般有两类,一类只涉及到提供方和使用者,另一类还涉及到最终用户.因此,前一类在认证上也只涉及两方,而后一类还涉及到用户授权,也就是通常使用的 OAuth.这里先说说第一类.比如 amazon aws 的 api.google 的地图 api 等

Web API之认证(Authentication)及授权(Authorization)【一】(十二)

前言 无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请求信息的认证以及认证成功过后对于访问页面的授权是极其重要的,用两节来重点来讲述这二者,这一节首先讲述一下关于这二者的一些基本信息,下一节讲通过实战以及不同的实现方式来加深对这二者深刻的认识,希望此文对你有所收获. Identity Identity代表认证用户的身份,下面我们来看看此接口的定义 public interface IIdentity { // Properties string Authenti

[转]Web APi之认证(Authentication)及授权(Authorization)【一】(十二)

本文转自:http://www.cnblogs.com/CreateMyself/p/4856133.html 前言 无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请求信息的认证以及认证成功过后对于访问页面的授权是极其重要的,用两节来重点来讲述这二者,这一节首先讲述一下关于这二者的一些基本信息,下一节将通过实战以及不同的实现方式来加深对这二者深刻的认识,希望此文对你有所收获. Identity Identity代表认证用户的身份,下面我们来看看此接口的定义 ?

基于Node的PetShop,RESTful API以及认证

由于宠物店的业务发展需要,我们需要一种更加便捷的方式来管理日益增多的宠物和客户.最好的方法就是开发一个APP,我可以用这个APP来添加.更新和删除宠物.同时,业务要给宠物店的会员用户有限查看某些宠物. 我们在开发中会用到NodeJs以及基于NodeJs的开发框架,如:Express,Mongoose(用来管理MongoDB的数据),Passport(认证)等工具. 开始 我们这个项目的结构大概是这样的: petshot/ //服务端和客户端(android) server/ //服务端 mode