Flask-JWT-Extended: @jwt_refresh_token_required 注释不起作用
Flask-JWT-Extended: @jwt_refresh_token_required annotation does not work
我有一个登录资源(/login
端点),遵循 Oleg Agapov 的 tutorial:
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 header 调用此端点应该 return:
{
"answer": 42
}
没有 @jwt_refresh_token_required
注释(不发送任何标记)这正是我得到的。但是我需要注释来保护我的端点并满足一些令牌要求。
只有它不起作用。使用 Authentication : Bearer *Refresh_Token*
header 我只得到:
{
"message": "Internal Server Error"
}
我知道 access_token
应该用于此目的,但我不想要它,因为它有 15 分钟的过期时间。我不明白为什么会出现问题,因为我们正在做同样的事情来使用需要 refresh_token
的端点刷新 access_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)
我在这里错过了什么?
正如 所建议的,我需要添加
app.config['PROPAGATE_EXCEPTIONS'] = True
在配置应用程序对象时查看实际错误,导致代码中断并且 return 代码 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)
我有一个登录资源(/login
端点),遵循 Oleg Agapov 的 tutorial:
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 header 调用此端点应该 return:
{
"answer": 42
}
没有 @jwt_refresh_token_required
注释(不发送任何标记)这正是我得到的。但是我需要注释来保护我的端点并满足一些令牌要求。
只有它不起作用。使用 Authentication : Bearer *Refresh_Token*
header 我只得到:
{
"message": "Internal Server Error"
}
我知道 access_token
应该用于此目的,但我不想要它,因为它有 15 分钟的过期时间。我不明白为什么会出现问题,因为我们正在做同样的事情来使用需要 refresh_token
的端点刷新 access_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)
我在这里错过了什么?
正如
app.config['PROPAGATE_EXCEPTIONS'] = True
在配置应用程序对象时查看实际错误,导致代码中断并且 return 代码 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)