flask-jwt-extended:装饰器@ jwt.token_in_blacklist_loader始终吊销令牌

时间:2020-01-02 09:59:13

标签: python flask flask-jwt-extended

在我的app.py中,我初始化flask-jwt-extended如下:

# Setup the Flask-JWT-Extended extension
app.config['RESTPLUS_MASK_SWAGGER'] = False # remove default X-Fields field in swagger
app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
app.config['JWT_BLACKLIST_ENABLED'] = True
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access', 'refresh']
jwt = JWTManager(app)

然后我使用代码段登录时创建令牌:

            expires = datetime.timedelta(minutes=10)
            access_token = create_access_token(identity=payload['email'], fresh=True, expires_delta=expires)
            refresh_token = create_refresh_token(identity=payload['email'])

奇怪的是,如果我将装饰器@ jwt.token_in_blacklist_loader添加到某个端点,我总是会收到“令牌已被撤销”错误消息。

@jwt.token_in_blacklist_loader
@api.route('/')
class UserList(Resource):
    @jwt_required
    @api.doc('list_users')
    @api.marshal_list_with(user)
    def get(self):
        '''Get all users'''
        users = UserApi.query.all()
        return users

据我所知,这个装饰器将检查令牌是否已列入黑名单,而我只是从登录名创建新令牌,创建新令牌并检查令牌是否已列入黑名单的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

摘自flask-jwt-extended的文档:

此装饰器设置将在以下情况下调用的回调函数: 受保护的端点已访问,将检查是否已JWT 被撤销。默认情况下,不使用此回调。

提示:回调必须是一个带有一个参数的函数,该参数 是已解码的JWT(Python词典),如果 令牌已被列入黑名单(或被认为已撤销),或 否则True

访问受保护的端点时,False装饰器用于设置回调函数。您应该在检查您的令牌是否已列入黑名单的函数上使用此装饰器。使用内存保存列入黑名单的令牌的简单示例:

token_in_blacklist_loader

有关更多信息,请在此处查看示例:https://flask-jwt-extended.readthedocs.io/en/stable/blacklist_and_token_revoking/

答案 1 :(得分:0)

您是否还记得将新生成的access_token(来自refresh_token)添加到黑名单数据库中?假设黑名单数据库中缺少的所有令牌都已撤销...