Api с flask-jwt-extended с проблемами аутентификации? - PullRequest
0 голосов
/ 23 мая 2019

Я создал API с flask-restful и flask-jwt-extended и правильно настроил проходы проверки для истечения срока действия токена и его аннулирования. Однако, несмотря на то, что он построил истечение срока действия токена и недействительные обратные вызовы проверки, API-интерфейс не обрабатывается правильно и сообщает об ошибке: срок действия подписи

На облачном сервере у нас есть Centos 7 x64 по 16 Гб оперативной памяти, на котором запущено приложение с использованием gunicorn в версии 19.9.0. Использование миниконды для создания среды Python приложений.

В тестах в производственной среде приложение жалуется на просроченный токен. Однако в тестовой среде, с использованием Ubuntu 18.04.2, x64 с оперативной памятью 16 ГБ, с теми же настройками, что и у miniconda и gunicorn, у приложения нет проблем с его выполнением, возвращая правильное сообщение по истечении срока действия токена.

Мой jwt.py

from flask import Blueprint, Response, json, request
from flask_jwt_extended import (JWTManager, create_access_token,
                                create_refresh_token, get_jwt_identity,
                                jwt_required)

from app.models.core import User

from .schemas import UserSchema
from .utils import send_reponse, user_roles


def configure_jwt(app):
    JWT = JWTManager(app)

    @JWT.expired_token_loader
    def my_expired_token_callback(expired_token):
        return Response(
            response=json.dumps({
                "message": "Expired token"
            }),
            status=401,
            mimetype='application/json'
        )

    @JWT.invalid_token_loader
    def my_invalid_token_callback(invalid_token):
        return Response(
            response=json.dumps({
                "message": "Invalid token"
            }),
            status=422,
            mimetype='application/json'
        )

Журнал ошибок:

[2019-05-23 15:42:02 -0300] [3745] [ERROR] Exception on /api/company [POST]
Traceback (most recent call last):
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_restful/__init__.py", line 458, in wrapper
    resp = resource(*args, **kwargs)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask/views.py", line 88, in view
    return self.dispatch_request(*args, **kwargs)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_restful/__init__.py", line 573, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 102, in wrapper
    verify_jwt_in_request()
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 31, in verify_jwt_in_request
    jwt_data = _decode_jwt_from_request(request_type='access')
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 266, in _decode_jwt_from_request
    decoded_token = decode_token(encoded_token, csrf_token)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_jwt_extended/utils.py", line 107, in decode_token
    allow_expired=allow_expired
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/flask_jwt_extended/tokens.py", line 138, in decode_jwt
    leeway=leeway, options=options)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/jwt/api_jwt.py", line 104, in decode
    self._validate_claims(payload, merged_options, **kwargs)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/jwt/api_jwt.py", line 134, in _validate_claims
    self._validate_exp(payload, now, leeway)
  File "/home/company/miniconda3/envs/api_ms/lib/python3.6/site-packages/jwt/api_jwt.py", line 175, in _validate_exp
    raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired

Я пытаюсь понять, почему приложение может правильно возвращать сообщение об истечении срока действия токена в тестовой среде, где в производственной среде возвращается код ошибки 500 Internal Server Error. Помимо исправления этой проблемы в нашем приложении.

1 Ответ

0 голосов
/ 24 мая 2019

На основании этой ссылки, найденной в репозитории проекта, я обнаружил, что проблема связана с параметром конфигурации колбы под названием PROPAGATE_EXCEPTIONS, который должен быть True.

Проблема в репозитории flask-jwt-extended, которая помогла мне найти ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...