Ger*_*rry 2 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)
Run Code Online (Sandbox Code Playgroud)
然后我使用代码段在登录中创建令牌:
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'])
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将装饰器 @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
Run Code Online (Sandbox Code Playgroud)
据我所知,这个装饰器是检查令牌是否被列入黑名单,我只是从登录创建一个新令牌,创建新令牌并检查令牌是否被列入黑名单的最佳实践是什么?
从文档flask-jwt-extended:
此装饰器设置回调函数,当访问受保护的端点时将调用该回调函数,并将检查 JWT 是否已被撤销。默认情况下,不使用此回调。
提示:回调必须是一个函数,它接受一个参数,即解码后的 JWT(python 字典),
True如果令牌已被列入黑名单(或被视为已撤销),则返回,False否则返回。
token_in_blacklist_loader当访问受保护的端点时,装饰器用于设置回调函数。您应该在检查您的令牌是否被列入黑名单的函数上使用此装饰器。使用内存保存列入黑名单的令牌的简单示例:
blacklist = set()
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti']
return jti in blacklist
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看此处的示例:https : //flask-jwt-extended.readthedocs.io/en/stable/blacklist_and_token_revoking/