本文主要讲述了基于flask实现了http的基础认证和摘要认证。
1. 基本认证机制
工作原理
-
客户端向服务器端发送网络请求时,没有携带任何认证信息
-
服务器接收到请求后检查请求头是否具有
authorization
的键值对-
如果具有该键值对,则对收到的
authorization
的值,进行解密,获取对应的用户登录信息;根据用户登录信息,正常回复网页 -
如果不存在该键值对,则响应
401
状态码,并在响应头中设置www-authorization
键值对
-
-
客户端接收到
401
状态码的响应后,输入用户登录凭证,此时请求头中会添加authorization
键值对
加密算法
-
客户端将用户输入的用户名
username
和密码password
,组合成新的字符串username:password
-
然后利用
base64
加密算法对username:password
字符串加密,形成密文hashedstr
-
客户端将
Basic
字符串和hashedstr
拼接,写入authorization
请求头中
代码实现
from flask import Flask,make_response,request, redirect
import base64app = Flask(__name__)@app.route('/basic')
def basic():authorization = request.headers.get('authorization') # 对http基本认证的实现, 密文的格式为: `用户名:密码`if not authorization:resp = make_response()resp.headers['www-authenticate'] = '''Basic realm= home'''return resp, 401else:print(authorization)bdecode = base64.b64decode(authorization.split(' ')[-1])name = bdecode.decode('utf-8').split(':')[0] # 用户名m = hashlib.md5()m.update('123456'.encode('utf-8')) # 此处需要进行数据库用户密码的获取pwd = m.hexdigest()input_pwd = bdecode.decode('utf-8').split(':')[-1] # 用户输入的密码# 此处需要对比pwd和input_pwdreturn redirect('/digest')
基本认证的示例:
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
前端的登录