首页 > 解决方案 > Flask Restful NoAuthorizationError 缺少授权标头

问题描述

我正在使用 Python 3.6 在生产模式下的服务器上运行 Flask Restful,并访问需要 jwt auth 的端点,但我不断收到“NoAuthorizationError Missing Authorization Header”错误。

奇怪的是,使用 Postman 将相同的请求发送到我的 Mac 上完全相同的 Flask 应用程序的本地版本,它工作得很好,没有任何错误。该问题仅发生在实时服务器上,并且所有 pip 包的版本也完全相同。

更新 我在实时服务器上使用 Gunicorn,当我停止应用程序并正常运行时,使用python run.py错误消失并返回正确的响应。

我为 jwt 错误设置了以下处理程序,并且再次在我的应用程序的本地版本中捕获了它:

出于测试目的,我不会在请求本身中发送令牌。即使我这样做了,错误仍然存​​在。

这是我的 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

我一直试图在这里跟踪这个问题,但没有成功。

标签: pythonflaskjwtgunicornflask-restful

解决方案


对于遇到此错误的其他人来说,这实际上是 Flask Restful 本身以及它如何处理错误的问题。

解决方案#1

第一个对我有用的解决方案是传播异常......这意味着异常被重新引发而不是由应用程序的错误处理程序处理。但是,根据这个,它不是一个很好的解决方案,因为它覆盖了 Flask 的本机错误处理函数:app.handle_user_exceptionapp.handle_exception.

因此,您将PROPAGATE_EXCEPTIONS在您的应用程序配置中进行设置:

app.config['PROPAGATE_EXCEPTIONS'] = True

解决方案#2

我要采用的最终解决方案是增强 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

推荐阅读