У меня есть ресурс для входа (/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"
}
Я знаю, 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)
Что мне здесь не хватает?