Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask werkzeug request.authorization不存在,但存在授权标头_Flask_Werkzeug - Fatal编程技术网

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

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:',

我发布了一些JSON数据,并添加了一个
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="}'