Проблема: < /strong>
Я строю бэкэнд колбы, используя фарбовую, флас-JWT-расширенную и Postgresql. При тестировании истечения срока действия токена JWT через Postman токены с истекшим сроком действия последовательно приводят к 500 внутренней ошибке сервера вместо чистого 401 несанкционированного ответа. < /P>
желаемое поведение: < /strong>
Когда токен JWT истекает, мой API должен вернуть json response:
{»: />Currently, an expired token results in this error:
{"message": "Internal Server Error"}
Server Logs Traceback: jwt.exceptions.ExpiredSignatureError: Signature has expired
Relevent Code:
инициализация приложения приложения ( init .py)
from flask import Flask, jsonify
from flask_jwt_extended import JWTManager
from flask_restful import Api
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
import os
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
CORS(app, supports_credentials=True)
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL')
app.config['JWT_SECRET_KEY'] = os.getenv('JWT_SECRET_KEY', 'temporary_secret')
jwt = JWTManager(app)
db = SQLAlchemy(app)
api = Api(app)
migrate = Migrate(app, db)
# JWT error handlers
@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):
return jsonify({"message": "Token has expired"}), 401
@jwt.invalid_token_loader
def invalid_token_callback(error):
return jsonify({"message": "Invalid token"}), 401
@jwt.unauthorized_loader
def unauthorized_callback(error):
return jsonify({"message": "Missing or invalid Authorization header"}), 401
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
< /code>
outrce resource (auth_resource.py) < /strong> < /p>
from flask_restful import Resource, reqparse
from flask_jwt_extended import (
create_access_token, create_refresh_token, jwt_required, get_jwt_identity
)
from werkzeug.security import check_password_hash
from datetime import timedelta
from app.models import User
parser = reqparse.RequestParser()
parser.add_argument('username', required=True)
parser.add_argument('password', required=True)
class LoginResource(Resource):
def post(self):
data = parser.parse_args()
user = User.query.filter_by(username=data['username']).first()
if user and check_password_hash(user.password_hash, data['password']):
access_token = create_access_token(identity=user.id, expires_delta=timedelta(seconds=30))
refresh_token = create_refresh_token(identity=user.id, expires_delta=timedelta(minutes=2))
return {'access_token': access_token, 'refresh_token': refresh_token}, 200
return {'msg': 'Invalid credentials'}, 401
class ProtectedResource(Resource):
@jwt_required()
def get(self):
identity = get_jwt_identity()
return {'logged_in_as': identity}, 200
< /code>
Подход и результаты тестирования (почтальон) < /strong>
login Works (200 OK), возвращает токены. /> Ожидается: 401 {"Сообщение": "Токен истек"} < /p>
Фактическое: 500 Ошибка внутреннего сервера < /p>
журналы сервера: < /strong> < /p>
Ошибка в App: Exception on /api /protected [get]
forcebbace: exception on /api /protected [get]
forcebbace: exception on /api /protected [get]
forcebac "/usr/local/lib/python3.11/site-packages/flask/app.py", Line 917, in full_dispatch_request
rv = self.dispatch_request ()
file "/usr/local/lib/python3.11/site-packages/flask/app.pry, lineathes /> return self.ensure_sync (self.view_functions [rule.endpoint]) (** view_args)
file "/usr/local/lib/python3.11/site-packages/flask_restful/ introng>.pry", Line 604, в диспетче ** kwargs)
file "/usr/local/lib/python3.11/site-packages/flask_jwt_extended/view_decorators.py", строка 167, в декораторе
verify_jwt_in_request (
"/usr/local/lib/python3.11/site-packages/flask_jwt_extended/utils.py", line 128, в decode_token
return jwt_manager._decode_jwt_from_config (incoded_token, csrf_value, allow_expired)
raise ExpiredSignatureError("Signature has expired")
jwt.exceptions.ExpiredSignatureError: Signature has expired
то, что я пробовал без успеха: < /strong>
реализовано обработки глобальных ошибок JWT (expired_token_loader). < /p>
Проверенная правильная регистрация обратных вызовов JWT. < /p>
Упрощено код конечной точки, чтобы удалить внутреннюю обработку исключения (как jwt ошибки должны быть вновь. /> Полностью перестроенные контейнеры Docker несколько раз для обеспечения свежего развертывания. < /p>
Вопросы < /strong>
Почему мой глобальный истек_token_loader захватывает истеклиц. flask_restful, который предотвращает запуск глобальных обработчиков? /> Flask-jwt-extended: последнее < /p>
Flask-restful: Последний < /p>
база данных Postgresql (Dockerized) < /p>
Docker Compose для настройки для бэкэнд, фронта и database < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -and-flask
Jwt token expiration expiration обработка, вызывая 500 ошибок в Flask-jwt-exted и chlask-restful ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение