【发布时间】:2020-02-26 06:32:06
【问题描述】:
我有一个登录资源(/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 标头调用此端点应返回:
{
"answer": 42
}
没有@jwt_refresh_token_required 注释(不发送任何令牌)这正是我得到的。但是我需要注释来保护我的端点并满足一些令牌要求。
只是它不起作用。使用 Authentication : Bearer *Refresh_Token* 标头我只得到:
{
"message": "Internal Server Error"
}
我知道access_token 应该用于此,但我不希望它有 15 分钟的过期时间。我不明白为什么会出现问题,因为我们正在使用需要refresh_token 的端点来刷新access_token 本身。我当然可能是错的。
这是来自 poject_folder 根文件夹的 __init__.py 的 sn-p,其中检查了撤销:
@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)
我在这里错过了什么?
【问题讨论】:
-
查看以下内容,了解为什么您会看到 500 错误而不是 400 错误:github.com/vimalloc/flask-jwt-extended/issues/…。返回 400 错误应该会告诉您验证令牌时实际出了什么问题。
-
@vimalloc 感谢您的回复。我不确定您建议进行哪些修改。我应该只使用
jwt._set_error_handler_callbacks(api)设置错误处理程序,还是需要以某种方式在秘密端点中返回额外的 400 错误代码? -
只是 _set_error_handler_callback 或 PROPAGATE_EXCEPTIONS 的事情。 Flask_jwt_extended 应该返回一个 400 响应,详细说明解码令牌失败的原因,例如它是否丢失、过期等,但默认情况下,flask restful 和 rest plus 不能很好地发挥作用。
-
我收到
@app.errorhandler(NoAuthorizationError) AttributeError: 'Api' object has no attribute 'errorhandler'。我应该给 Api 对象还是 de Flask 对象作为参数? -
哦,看来那个指南使用的是flask-restful,而不是flask-restplus。对于 flask-restful,您将需要使用它 (github.com/vimalloc/flask-jwt-extended/issues/…),而不是 _set_error_handler_callbacks 的东西。
标签: python access-token flask-restful refresh-token flask-jwt-extended