Flask werkzeug request.authorization不存在,但存在授权标头
我发布了一些JSON数据,并添加了一个Flask werkzeug request.authorization不存在,但存在授权标头,flask,werkzeug,Flask,Werkzeug,我发布了一些JSON数据,并添加了一个Authorization标题。但是,请求对象没有正确的授权属性HTTP_授权和标题都显示正确的授权详细信息 {'authorization': None, 'cookies': {}, 'environ': {'CONTENT_LENGTH': '81', 'CONTENT_TYPE': u'application/json', 'HTTP_AUTHORIZATION': 'testkey:',
Authorization
标题。但是,请求对象没有正确的授权属性<代码>HTTP_授权和标题
都显示正确的授权详细信息
{'authorization': None,
'cookies': {},
'environ': {'CONTENT_LENGTH': '81',
'CONTENT_TYPE': u'application/json',
'HTTP_AUTHORIZATION': 'testkey:',
'HTTP_CONTENT_LENGTH': '81',
'HTTP_CONTENT_TYPE': 'application/json',
'HTTP_HOST': 'test',
'PATH_INFO': '/v1/test',
'QUERY_STRING': '',
'REQUEST_METHOD': 'POST',
'SCRIPT_NAME': '',
'SERVER_NAME': 'test',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'flask._preserve_context': False,
'werkzeug.request': <Request 'http://test/v1/test' [POST]>,
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x10d5471e0>,
'wsgi.input': <_io.BytesIO object at 0x11074c410>,
'wsgi.multiprocess': False,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)},
'headers': EnvironHeaders([('Authorization', testkey:'), ('Host', u'test'), ('Content-Length', u'81'), ('Content-Type', u'application/json')]),
'shallow': False,
'url': u'http://test/v1/test',
'url_rule': <Rule '/v1/test' (POST, OPTIONS) -> testresource>,
'view_args': {}}
{'authorization':无,
“cookies”:{},
'环境':{'CONTENT_LENGTH':'81',
“内容类型”:u“应用程序/json”,
“HTTP_授权”:“testkey:”,
“HTTP_CONTENT_LENGTH”:“81”,
“HTTP内容类型”:“应用程序/json”,
“HTTP_主机”:“测试”,
“路径信息”:“/v1/test”,
“查询字符串”:“”,
“请求方法”:“发布”,
“脚本名称”:“,
“服务器名称”:“测试”,
“服务器端口”:“80”,
“服务器协议”:“HTTP/1.1”,
“烧瓶.\u保存\u上下文”:False,
“werkzeug.request”:,
“wsgi.errors”:,
“wsgi.input”:,
“wsgi.multiprocess”:False,
'wsgi.multi-thread':False,
'wsgi.run_once':False,
'wsgi.url_scheme':'http',
'wsgi.version':(1,0)},
“标题”:环境标题([('Authorization',testkey:'),('Host',u'test'),('Content-Length',u'81'),('Content-Type',u'application/json')),
"浅":假,,
'url':u'http://test/v1/test',
“url_规则”:testresource>,
'视图参数':{}
只有当您拥有有效的or标头时,才会设置请求.授权
属性;Authorization
标题具有特定格式,其中标题值中的第一个单词设置类型,该属性仅处理这两种特定类型(由Basic
或Digest
类型关键字标记)
从
已解析形式的授权对象
以下是:
表示客户端发送的授权标头。您不应该自己创建此类对象,而是在parse_authorization_header函数返回此类对象时使用它
即:
解析由web浏览器传输的HTTP基本/摘要授权头。如果标头无效或未给定,则返回值为无,否则为授权
对象
我的
您的标题不是这样一个有效的标题;它没有基本
或摘要
类型指示器。如果确实有这样一个头,则函数返回的不是None
:
>>> from werkzeug.http import parse_authorization_header
>>> parse_authorization_header('testkey:')
>>> parse_authorization_header('testkey:') is None
True
>>> parse_authorization_header('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==')
{'username': 'Aladdin', 'password': 'open sesame'}
>>> result = _
>>> type(result)
<class 'werkzeug.datastructures.Authorization'>
>>> result.username
'Aladdin'
>>> result.password
'open sesame'
您的授权头
('authorization','testkey:')
需要进行Base64编码,并包括Basic
在python中:
import base64
base64.b64encode('testkey:') # 'dGVzdGtleTo='
在javascript中,使用以下命令设置标题:
在您的情况下,这将导致标题显示为:
('Authorization','Basic dGVzdGtleTo=')
当使用apache+WSGI时,不要忘记WSGIPassAuthorization On
指令。请添加到实际的控制台/web视图中好吗error@Ondeckshooting-没有错误。请阅读问题。问题是authorization属性为None,但存在正确的头。需要进行Base64编码并包含Basic是其关键,示例:{“authorization”:“Basic dGVzdGtleTo=”}
否则它将显示在request.environ['HTTP_authorization']
承载令牌也可以以相同的方式发送,但这里不需要Base64编码,尽管{“授权”:“承载AbCdEf123456”}
这对我很有帮助,谢谢。出于好奇,为什么授权头在apache中没有默认传递(或者是wsgi阻止了它)?我也很好奇:默认情况下不会传递授权头,因为这样做可能会将有关密码的信息泄露给WSGI应用程序,而当Apache执行授权时,WSGI应用程序应该无法看到这些信息。如果Apache正在执行授权,WSGI应用程序仍然可以通过检查WSGI应用程序环境的变量AUTH_type来找出所使用的授权方案的类型……非常感谢!这节省了我很多时间!!
import base64
base64.b64encode('testkey:') # 'dGVzdGtleTo='
'{"Authorization": "Basic ' + btoa('testkey:') + '"}'
'{"Authorization": "Basic dGVzdGtleTo="}'