最近需要将基本认证替换为摘要认证。关于摘要认证的原理在网上有很多,讲的也很好。关于摘要认证的过程和原理大家可以阅读一下这篇文章。前端使用requests模块发送请求,后端使用flask模块接收请求并验证。
最开始以为需要做很多的工作,但是最后发现其实大部分工作模块都帮你自动完成了(包括返回前端接收401之后处理服务器返回的nonce等值,并将密码等生成response,再发送到后端和后端对摘要response的比较验证。)自己只要完成很少的工作量,其实也就是定义get_password()函数。
Flask-HTTPAuth源码中,在examples中可以看到给出的示例如下:
from flask import Flask
from flask_httpauth import HTTPDigestAuth
app = Flask(__name__)
['SECRET_KEY'] = 'secret key here'
auth = HTTPDigestAuth()
users = {
"john": "hello",
"susan": "bye"
}
@auth.get_password
def get_pw(username):
if username in users:
return (username)
return None
@('/')
@auth.login_required
def index():
return "Hello, %s!" % ()
if __name__ == '__main__':
()
这是服务器端的代码,一定要设置SECRET_KEY值,不然会报secret key not set in flask session。
下面来解读一下上面的代码,首先根据路径找到index()函数,然后执行auth.login_required函数。大家可以去看看HTTPDigestAuth源码,看别人的源码可以学习很多。源码需要调用get_password()函数,但是源码里没有定义需要我们自己补充,这里我们需要自己定义get_pw()函数来获取密码,以完成真正的验证。
前端我是使用requests模块,其实也很简单只需将auth替换为HTTPDigestAuth,如下所示。
r = (url, auth=HTTPDigestAuth(username, password)) #username, password你的用户名和密码
这样一个从前端到后端的摘要认证就完成了。
如有转载请标明引用出处:/yibuchen/article/details/80615458