python|web框架|增加BasicAuth认证

简介: python|web框架|增加BasicAuth认证

上一篇文章,我们已经为框架定义了【响应对象】,该框架不仅可以获取客户端上传的报文信息,还能生成一些简单信息,如自定义响应头等等。今天我们再次完善一下该框架,给框架增加权限验证的功能,给框架加上一个BasicAuth的方法。


本篇文章所依赖的环境为:

image.png


本次代码已经放到了gitee上:gitee.com/pdudo/golea…


什么是http BashAuth


在日常生活或者工作中,你是否见到过这样的页面呢?

image.png

当我们打开窗口,网页并不是里面加载出来的,而是弹出了一个输入框,让我们输入其用户名和密码,输入后待服务器验证通过后,才开始展现实际的网页内容。这个就是BashAuth了,全称为: Basic access authentication,也称基本认证。是一种极其简单http协议身份验证方式。BashAuth认证的方式是通过请求头来发送和校验的,而非我们熟知的cookietoken等。


还有一点需要注意,这里所展现的输入框,其实是浏览器底层拆解协议所支持的。




BasicAuth认证底层原理


BasicAuth使用的http协议进行身份验证的,所以会将身份信息携带在请求头中进行传输。


第一步: 用户在第一次进行浏览器请求页面的时候,不会携带认证信息,此时服务器接接收信息后,判断报文中请求头没有WWW-Authenticate,此时会返回客户端报文,其中需要将报文响应状态码为401,响应头新增一个keyWWW-


Authenticate,值为realm加上请求域,做法是为了避免和其他URL相冲突。所以响应核心报文为:

HTTP/1.0 401 Unauthorized
WWW-Authenticate: Basic realm="pdudo sites"

其中状态码为401代表客户端错误,指的是需要身份验证,WWW-Authenticate响应头的值为Basic realm="pdudo sites"Basic代表验证的模式,realm代表请求域,请求域是为了和其他URL相冲突。


第二步: 当浏览器接收到该报文后,会判断其状态码为401并且请求头中有keyWWW-Authenticate,此时便会弹出输入框,让用户输入信息以便服务器校验。

输入之后,不是直接发送给服务器,而是会根据服务器发送的验证模式进行校验,如basic,加入客户端发送的报文如下:

GET /index HTTP/1.1
HTTP_AUTHORIZATION: Basic cGR1ZG86anVlamlu

其中Get代表请求方式,/index表示请求路径,HTTP/1.1http的版本。请求头HTTP_AUTHORIZATION表示验证数据,Basic是验证方式,cGR1ZG86anVlamlu表示用户名:密码,只不过浏览器使用base64进行编码了而已。


第三步: 服务器在接收到报文后,发现有HTTP_AUTHORIZATION,则会使用base64解码,发现客户端上传的数据为pdudo:juejin,以:为分割,前者是用户名,后则是密码。当验证通过后,进行发送其他信息,若验证未通过,则重复第一步。



BasicAuth认证添加到框架中


我们已经知晓了BasicAuth认证的底层原理,所以可以开始修改我们的框架了,我们将其代码写到上一篇所述的response类中,代码如下:

def basicAuth(self):
    if "HTTP_AUTHORIZATION" not in self.response:
        return None,None,"HTTP_AUTHORIZATION request header not found"
    else:
        originalVal = self.response["HTTP_AUTHORIZATION"]
        types = originalVal.split(" ")[0]
        values = originalVal.split(" ")[1]
        if types == "Basic":
            userAndPasswd = base64.b64decode(values).decode()
            user = userAndPasswd.split(":")[0]
            passwd = userAndPasswd.split(":")[1]
            return user,passwd,None
        else:
            return None, None, "HTTP_AUTHORIZATION request error,unrecognized type: %s " %(types)




当客户端函数调用basicAuth时,服务器检查客户端http报文中,是否有HTTP_AUTHORIZATION,如果没有,则直接返回HTTP_AUTHORIZATION request header not found


若请求头有该key,则将其抓出来存储到originalVal中,它的值类似于: Basic cGR1ZG86anVlamlu,前者是认证类型,后者是加密后字符串,所以我们需要分开将其取出来,存到typesvalues中,再判断types是否是Basic,如果是我们使用base64进行解密,解密后的值类似于pdudo:juejin,以冒号(:)隔开,前者为用户名,后者为密码,所以我们需要将字符串按照:进行拆分,前者保存到user中,后者保存到passwd中,最后将其数据给函数。


那当第一步检查请求头没有HTTP_AUTHORIZATION或者用户名密码不对,应该如何返回呢? 这个需要用户在函数中进行调用即可,例如:

@myWeb.routes(path="/index",methods="all",regular=False)
def index(r):
    username, password , isok = r.basicAuth()
    if isok != None or username != "pdudo" or password != "juejin":
        r.set_headers("WWW-Authenticate","Basic realm="pdudo sites"")
        r.status_code(401)
        return
    return "123"

上述代码,使用我们自己编写的myWeb框架,定义了一个路由/index,其方法为Get或者Postregular=False则不使用正则路由,在函数中,通过r.basicAuth()来获取客户端上传的用户名密码,当用户名不等于pdudo或者密码不等于juejin或者解析失败的时候,会将响应状态码定义为401,并且设置响应头,keyWWW-Authenticate,值为Basic realm="pdudo sites"



框架功能测试


这里就不贴myWeb.py的代码了,太长了,大家可以去gitee上看,这里贴一下main.py代码:

image.png


为了方便,我将每次获取到的数据,都打印一下,方便待会查看数据。

执行代码后,打开浏览器输入http://pdudo.juejin.cn:8888/index,当弹出框后,我们第一个故意输错,第二次才输正确:

image.png

我们查看服务器日志,如下:

image.png



一共收到了3次,第一个输出后,并没有携带报文,被挡回来了,所以用户名和密码都为None,第二次则是密码输入不正确被挡回来了,第三次输入正确,成功得到数据123



总结


本篇文章,我们介绍了一个极其古老的认证方式: BashAuth, 它是通过请求头来发送数据和验证的。接着我们了解了一下其认证过程,其中最常用的是类型是Basic,它表示将数据进行base64编码后传输,注意是编码,不是加密。所以在使用该功能的时候,最好配合https使用,以便被抓包后破解。 最后将其添加到我们的web框架myWeb.py中。


相关文章
|
6月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
456 0
|
6月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
531 1
|
6月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
638 0
|
6月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
331 0
|
9月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
203 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
9月前
|
JSON 监控 BI
拼多多批量下单工具,拼多多买家批量下单软件,低价下单python框架分享
使用Selenium实现自动化操作流程多线程订单处理提升效率
|
9月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
6月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
562 1
|
7月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
193 1
|
7月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
301 0

推荐镜像

更多