Flask Restful NoAuthorizationError Отсутствует заголовок авторизации - PullRequest
0 голосов
/ 30 августа 2018

Я запускаю Flask Restful на сервере в производственном режиме с использованием Python 3.6 и поражаю конечную точку, требующую аутентификации jwt, но продолжаю получать ошибку «NoAuthorizationError Missing Authorization Header».

Странная часть в том, что тот же самый запрос отправляется с помощью Postman в локальную версию точно такого же приложения Flask на моем Mac, и он прекрасно работает без каких-либо ошибок. Проблема возникает только на работающем сервере, и все пакеты pip также имеют одинаковую версию.

UPDATE Я использую Gunicorn на работающем сервере, и когда я останавливаю приложение и работаю нормально, используя python run.py, ошибка исчезает и возвращает правильный ответ.

У меня установлены следующие обработчики для ошибок 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

Я пытался отследить эту проблему здесь , но не добился успеха.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Для всех, кто сталкивался с этой ошибкой, на самом деле это проблема самого Flask Restful и того, как он обрабатывает ошибки.

Раствор № 1

Первое решение, которое сработало для меня, состояло в том, чтобы распространять исключения ... это означает, что исключения повторно генерируются, а не обрабатываются обработчиками ошибок приложения. Однако в соответствии с этим не является хорошим решением, поскольку оно переопределяет собственные функции обработчика ошибок Flask: app.handle_user_exception и app.handle_exception.

Таким образом, вы должны установить PROPAGATE_EXCEPTIONS в конфигурации вашего приложения:

app.config['PROPAGATE_EXCEPTIONS'] = True

Решение № 2

Окончательное решение , которое я собираюсь использовать с , заключается в улучшении обработчика ошибок Api Flask на основе недавнего предложения , найденного здесь .

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
0 голосов
/ 06 сентября 2018

Вы пытались добавить:

"WSGIPassAuthorization On"

внутри вашей конфигурации виртуального каталога wsgi? Заголовок авторизации по умолчанию не передается Приложению, так как он должен обрабатываться веб-сервером. Если он обрабатывается вашим приложением python, вам понадобится это в коде конфигурации на производстве. Даже если с CORS все в порядке, оно вам понадобится, поскольку оно будет удалено из вашего запроса

0 голосов
/ 30 августа 2018

Ошибка, которую вы видите, означает, что заголовок авторизации не попадает в колбу. Либо оно не отправляется, либо что-то удаляет его, прежде чем фляга сможет добраться до него.

Используете ли вы Apache? Похоже, были и другие сообщения об удалении Apache этого заголовка. Возможно, проверьте Apache и удалите заголовок «Авторизация» (в частности, «WSGIPAssAuthorization») и посмотрите, решит ли это проблему для вас.

...