Flask Restful NoAuthorizationError 缺少授权 Header
Flask Restful NoAuthorizationError Missing Authorization Header
我在生产模式的服务器上使用 Python 3.6 运行ning Flask Restful 并访问需要 jwt 身份验证的端点,但我一直收到 "NoAuthorizationError Missing Authorization Header"错误。
奇怪的是,使用 Postman 将相同的请求发送到我 mac 上完全相同的 Flask 应用程序的本地版本,并且它工作正常,没有任何错误。问题只发生在live服务器上,所有的pip包也是完全相同的版本。
更新
我在实时服务器上使用 Gunicorn,当我停止应用程序并且 运行 通常使用 python run.py
时,错误消失并且 returns 正确响应。
我为 jwt 错误设置了以下处理程序,它再次被我的应用程序的本地版本捕获:
- jwt.token_in_blacklist_loader
- jwt.expired_token_loader
- jwt.invalid_token_loader
- jwt.revoked_token_loader
- jwt.needs_fresh_token_loader
- jwt.unauthorized_loader
- jwt.claims_verification_failed_loader
出于测试目的,我没有在请求本身中发送令牌。即使我这样做了,错误仍然存在。
这是我本地的回复 mac:
{
"errors": {
"application": "Missing Authorization Header",
"validation": null
},
"http_status": 401,
"message": "There was a problem authenticating your token.",
"status": 0,
"time": 20
}
这是实时服务器上的响应:
Aug 29 17:15:15 [5168]: return self.dispatch_request(*args, **kwargs)
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
Aug 29 17:15:15 [5168]: resp = meth(*args, **kwargs)
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 102, in wrapper
Aug 29 17:15:15 [5168]: verify_jwt_in_request()
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 31, in verify_jwt_in_request
Aug 29 17:15:15 [5168]: jwt_data = _decode_jwt_from_request(request_type='access')
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 284, in _decode_jwt_from_request
Aug 29 17:15:15 [5168]: raise NoAuthorizationError(errors[0])
Aug 29 17:15:15 [5168]: flask_jwt_extended.exceptions.NoAuthorizationError: Missing Authorization Header
我一直在尝试跟踪这个问题here,但没有成功。
您看到的错误意味着授权 header 没有达到 flask 应用程序。要么它没有被发送,要么在 flask 到达它之前有什么东西把它剥离了。
您在使用 Apache 吗?看起来还有其他关于 Apache 剥离 header 的报道。也许查看 Apache strips down "Authorization" header(特别是“WSGIPAssAuthorization”),看看是否能为您解决问题。
对于遇到此错误的任何其他人,这实际上是 Flask Restful 本身及其处理错误的方式的问题。
解决方案 #1
第一个对我有用的解决方案是 propagate the exceptions... meaning that exceptions are re-raised instead of being handled by the app's error handlers. However, according to this 这不是一个很好的解决方案,因为它覆盖了 Flask 的本机错误处理函数:app.handle_user_exception
和 app.handle_exception
.
因此您可以在应用配置中设置 PROPAGATE_EXCEPTIONS
:
app.config['PROPAGATE_EXCEPTIONS'] = True
解决方案#2
我要采用的 最终解决方案 是根据最近的建议 found here 增强 Flask Api 的错误处理程序。
from flask import Flask
from flask_restful import Api
class CustomApi(Api):
def handle_error(self, e):
for val in current_app.error_handler_spec.values():
for handler in val.values():
registered_error_handlers = list(filter(lambda x: isinstance(e, x), handler.keys()))
if len(registered_error_handlers) > 0:
raise e
return super().handle_error(e)
app = Flask(__name__)
api = CustomApi(app, prefix='/api/v2') # same params can be passed here
您是否尝试添加:
"WSGIPassAuthorization On"
在您的 wsgi 虚拟目录配置中?
授权 header 默认情况下不会传递给应用程序,因为它应该由网络处理 server.If 它由您的 python 应用程序处理,您将需要在生产配置代码中使用它.
即使 CORS 没问题,你也需要它,因为它将从你的请求中删除
我在生产模式的服务器上使用 Python 3.6 运行ning Flask Restful 并访问需要 jwt 身份验证的端点,但我一直收到 "NoAuthorizationError Missing Authorization Header"错误。
奇怪的是,使用 Postman 将相同的请求发送到我 mac 上完全相同的 Flask 应用程序的本地版本,并且它工作正常,没有任何错误。问题只发生在live服务器上,所有的pip包也是完全相同的版本。
更新
我在实时服务器上使用 Gunicorn,当我停止应用程序并且 运行 通常使用 python run.py
时,错误消失并且 returns 正确响应。
我为 jwt 错误设置了以下处理程序,它再次被我的应用程序的本地版本捕获:
- jwt.token_in_blacklist_loader
- jwt.expired_token_loader
- jwt.invalid_token_loader
- jwt.revoked_token_loader
- jwt.needs_fresh_token_loader
- jwt.unauthorized_loader
- jwt.claims_verification_failed_loader
出于测试目的,我没有在请求本身中发送令牌。即使我这样做了,错误仍然存在。
这是我本地的回复 mac:
{
"errors": {
"application": "Missing Authorization Header",
"validation": null
},
"http_status": 401,
"message": "There was a problem authenticating your token.",
"status": 0,
"time": 20
}
这是实时服务器上的响应:
Aug 29 17:15:15 [5168]: return self.dispatch_request(*args, **kwargs)
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
Aug 29 17:15:15 [5168]: resp = meth(*args, **kwargs)
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 102, in wrapper
Aug 29 17:15:15 [5168]: verify_jwt_in_request()
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 31, in verify_jwt_in_request
Aug 29 17:15:15 [5168]: jwt_data = _decode_jwt_from_request(request_type='access')
Aug 29 17:15:15 [5168]: File "/home/domain.com/apps/core-api/env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 284, in _decode_jwt_from_request
Aug 29 17:15:15 [5168]: raise NoAuthorizationError(errors[0])
Aug 29 17:15:15 [5168]: flask_jwt_extended.exceptions.NoAuthorizationError: Missing Authorization Header
我一直在尝试跟踪这个问题here,但没有成功。
您看到的错误意味着授权 header 没有达到 flask 应用程序。要么它没有被发送,要么在 flask 到达它之前有什么东西把它剥离了。
您在使用 Apache 吗?看起来还有其他关于 Apache 剥离 header 的报道。也许查看 Apache strips down "Authorization" header(特别是“WSGIPAssAuthorization”),看看是否能为您解决问题。
对于遇到此错误的任何其他人,这实际上是 Flask Restful 本身及其处理错误的方式的问题。
解决方案 #1
第一个对我有用的解决方案是 propagate the exceptions... meaning that exceptions are re-raised instead of being handled by the app's error handlers. However, according to this 这不是一个很好的解决方案,因为它覆盖了 Flask 的本机错误处理函数:app.handle_user_exception
和 app.handle_exception
.
因此您可以在应用配置中设置 PROPAGATE_EXCEPTIONS
:
app.config['PROPAGATE_EXCEPTIONS'] = True
解决方案#2
我要采用的 最终解决方案 是根据最近的建议 found here 增强 Flask Api 的错误处理程序。
from flask import Flask
from flask_restful import Api
class CustomApi(Api):
def handle_error(self, e):
for val in current_app.error_handler_spec.values():
for handler in val.values():
registered_error_handlers = list(filter(lambda x: isinstance(e, x), handler.keys()))
if len(registered_error_handlers) > 0:
raise e
return super().handle_error(e)
app = Flask(__name__)
api = CustomApi(app, prefix='/api/v2') # same params can be passed here
您是否尝试添加:
"WSGIPassAuthorization On"
在您的 wsgi 虚拟目录配置中? 授权 header 默认情况下不会传递给应用程序,因为它应该由网络处理 server.If 它由您的 python 应用程序处理,您将需要在生产配置代码中使用它. 即使 CORS 没问题,你也需要它,因为它将从你的请求中删除