Flask-JWT-Extended: @jwt_refresh_token_required аннотация не работает - PullRequest
0 голосов
/ 31 октября 2019

У меня есть ресурс для входа (/login конечная точка), следуя учебнику Олега Агапова :

class UserLogin(Resource):
    def post(self):
        data = parser.parse_args()
        current_user = User.find_by_email(data['email'])

        if not current_user:
            return {'message': 'User {} doesn\'t exist'.format(data['email'])}

        if User.verify_hash(data['password'], current_user.password):
            refresh_token = create_refresh_token(identity = data['email'])
            return {
                'message': 'Logged in as {}'.format(current_user.email),
                'refresh_token': refresh_token
                }
        else:
            return {'message': 'Wrong credentials'}

Вызов этой конечной точки с правильными учетными данными Я получаю ответ обратно:

{
  "message": "Logged in as test@gmail.com",
  "refresh_token": "eyJ0eXAiOiJKV1.............TheVeryLongRefreshTokenString...........JfkRatZ2NaA72Tl4b9C4-e3d6kXA"
}

Теперь у меня есть тестовый ресурс на конечной точке /secret:

class SecretResource(Resource):
    @jwt_refresh_token_required
    def get(self):
        return {
            'answer': 42
        }

Вызов этой конечной точки с refresh_token, включенным в качестве заголовка Bearer в запросе, должен вернуть:

{
   "answer": 42
}

Без аннотации @jwt_refresh_token_required (без отправки каких-либо токенов) это именно то, что я получаю. Но мне нужна аннотация, чтобы обезопасить мою конечную точку с некоторым требованием токена.

Только это не работает. Используя заголовок Authentication : Bearer *Refresh_Token*, я получаю только:

{
   "message": "Internal Server Error"
}

enter image description here

Я знаю, access_token следует использовать для этого, но я не хотелэто для его 15-минутного времени истечения. Я не понимаю, почему это может быть проблемой, поскольку мы делаем то же самое для обновления самого access_token конечной точкой, требующей refresh_token. Конечно, я могу ошибаться.

Это фрагмент из корневой папки poject_folder __init__.py, где проверяется отзыв:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return poject_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 31 октября 2019

Как подсказал @ vimalloc , мне нужно было добавить

app.config['PROPAGATE_EXCEPTIONS'] = True

при настройке объекта приложения, чтобы увидеть фактическую ошибку, вызывающую разрыв кода и возвращение кода 500

Ответ смущает прост: функция обратного вызова для проверки токена в файле __init__.py ссылалась на себя, поэтому мне пришлось удалить префикс project_folder:

Из этого:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return poject_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

К этому:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return Model.RevokedTokenModel.is_jti_blacklisted(jti)
...