在我的Flask中间件中获取标题时出现问题
我正在开发一个FlaskAPI,并试图实现基本的身份验证。为此,我使用一个中间件来检查“Authorization”头的内容。当我通过填充身份验证字段来执行请求时,它是有效的,但是当我试图从JavaScript代码中获取头时,它就不再有效了 我尝试了几种发送和检索标题的方法,但没有找到任何有效的方法 以下是我的中间件的Python代码:在我的Flask中间件中获取标题时出现问题,flask,header,authorization,middleware,Flask,Header,Authorization,Middleware,我正在开发一个FlaskAPI,并试图实现基本的身份验证。为此,我使用一个中间件来检查“Authorization”头的内容。当我通过填充身份验证字段来执行请求时,它是有效的,但是当我试图从JavaScript代码中获取头时,它就不再有效了 我尝试了几种发送和检索标题的方法,但没有找到任何有效的方法 以下是我的中间件的Python代码: class middleware(): def __init__(self, app): self.app = app de
class middleware():
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
request = Request(environ)
path = environ.get('PATH_INFO')
if request.authorization == None or request.authorization['username'] == "" or request.authorization['password'] == "":
res = Response(u"Missing informations", mimetype='text/plain', status=401)
return res(environ, start_response)
userName = request.authorization['username']
password = request.authorization['password']
users = db_session.execute(select(Player)).scalars()
for user in users:
if (userName == user.pseudo) and check_password_hash(db_session.execute(select(Player.password_hash).where(Player.pseudo==userName)).scalar(), password):
environ['user_pseudo'] = user.pseudo
environ['user_id'] = user.id
environ['auth'] = True
return self.app(environ, start_response)
res = Response(u'Authorization failed', mimetype='text/plain', status=401)
return res(environ, start_response)
这是我的JS代码:
function login() {
var url = "http://localhost:5000/test_login";
username = document.getElementById("username_l").value;
password = document.getElementById("password_l").value;
unencoded_token = username + ":" + password;
token = btoa(unencoded_token);
auth = 'Basic ' + token;
$.ajaxSetup({
headers: {"Authorization": auth }
});
$.ajax({
type: "GET",
url: url,
contentType: "application/json; charset=utf-8",
dataType: "json",
})
.done(function(data) {
CallbackLogin(data)
})
.fail(function(error) {
CallbackError(error);
});
}
有了这段代码,我得到了一个401错误,因为在中间件中似乎找不到“Authorization”头。有人知道我错过了什么吗
我忘了提到我的浏览器中有一个CORS错误,自从我安装中间件以来,我每次尝试提出请求都会遇到这个错误
提前感谢您的回答
已解决:
你好,我终于解决了我的问题
原因是:当通过我的浏览器(Firefox)发出请求时,创建了第一个选项请求,但没有由我的中间件处理,因为此请求中没有“授权”头,或者至少没有按照我的旧脚本所期望的方式
为了解决这个问题,我必须创建自己的行来处理请求的标题:
headers = dict(request.headers)
infos = str(headers.get("Authorization")).split(" ")
我可以使用这些行来检索标题“Authorization”的数据,我的中间件也可以使用这些行