我正在发布一些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': {}}
答案 0 :(得分:12)
request.authorization
属性仅在您拥有有效Basic Authorization或Digest Authorization标头时设置; Authorization
标头具有特定格式,其中标头值中的第一个单词设置类型,该属性仅处理这两种特定类型(由Basic
或Digest
类型关键字标记)。
来自AuthorizationMixin.authorization
attribute documentation
解析后的授权对象。
然后转到Authorization
object docs:
表示客户端发送的Authorization标头。您不应自己创建此类对象,但在 parse_authorization_header 函数返回时使用它。
解析Web浏览器传输的 HTTP基本/摘要授权标头。如果标头无效或未给出,则返回值为 None ,否则为
Authorization
对象。
大胆强调我的。
你的标题不是一个有效的标题;它没有Basic
或Digest
类型指标。如果你 有这样的标题,那么该函数会返回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'
我在那里使用了Basic
类型的标头,其中标头值的其余部分是由:
冒号分隔的base-64编码的用户名和密码对。
如果要实现自己的身份验证方案,只需访问标头本身并手动解析它。
auth = request.headers.get('authorization')
答案 1 :(得分:11)
您的授权标头('Authorization', 'testkey:')
需要进行Base64编码并包含Basic
。
在python中:
import base64
base64.b64encode('testkey:') # 'dGVzdGtleTo='
在javascript中使用btoa
设置标题:
'{"Authorization": "Basic ' + btoa('testkey:') + '"}'
'{"Authorization": "Basic dGVzdGtleTo="}'
在您的情况下,这将导致标题进入:
('Authorization', 'Basic dGVzdGtleTo=')
答案 2 :(得分:4)
使用apache + WSGI时,不要忘记WSGIPassAuthorization On
指令。