Flask werkzeug request.authorization是none,但授权标头存在

Pat*_*Yan 12 werkzeug flask

我正在发布一些JSON数据并添加Authorization标题.但是,请求对象没有正确的授权属性.HTTP_AUTHORIZATION并且headers都显示正确的授权详细信息.

{'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': {}}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

request.authorization仅当您具有有效的基本授权摘要授权标头时才设置该属性; 的Authorization报头具有特定的格式,其中在标头值的第一个字设置类型和属性仅处理这两个特定类型(由标记BasicDigest类型关键字).

AuthorizationMixin.authorization属性文档

解析形式的Authorization对象.

以下是Authorization对象docs:

表示客户端发送的Authorization标头.您不应该自己创建这种对象,而是在parse_authorization_header函数返回时使用它.

其被记录为:

解析Web浏览器传输的HTTP基本/摘要授权头.如果标头无效或未给出,则返回值为None,否则为Authorization对象.

大胆强调我的.

你的标题不是一个有效的标题; 它没有BasicDigest类型指示器.如果你确实有这样的标题,那么函数会返回以下内容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'
Run Code Online (Sandbox Code Playgroud)

Basic在那里使用了一个类型标头,其中标头值的其余部分是由:冒号分隔的base-64编码的用户名和密码对.

如果要实现自己的身份验证方案,只需访问标头本身并手动解析它.

auth = request.headers.get('authorization')
Run Code Online (Sandbox Code Playgroud)


Ril*_*ley 11

您的授权标头('Authorization', 'testkey:')需要进行Base64编码并包含Basic.

在python中:

import base64
base64.b64encode('testkey:') # 'dGVzdGtleTo='
Run Code Online (Sandbox Code Playgroud)

在javascript中使用btoa以下命令设置标题:

'{"Authorization": "Basic ' + btoa('testkey:') + '"}' 
'{"Authorization": "Basic dGVzdGtleTo="}' 
Run Code Online (Sandbox Code Playgroud)

在您的情况下,这将导致标题进入:

('Authorization', 'Basic dGVzdGtleTo=')


小智 5

使用apache + WSGI时,请不要忘记该WSGIPassAuthorization On指令。