flask-jwt-extended使用详解


相关配置注册jwt

1
2
3
app.config['JWT_SECRET_KEY'] = 'jwt-secret-attendance'
jwt = JWTManager(app)
app.config['JWT_BLACKLIST_ENABLED'] = False

产生token

1
2
access_token = create_access_token(identity=username)
return jsonify(msg="登录成功",access_token=access_token)

获取当前用户

1
username = get_jwt_identity()

高级用法

自定义密钥和加秘方式

1
2
3
4
5
6
7
8
9
10
access_token = encode_access_token(identity=jwt_manager._user_identity_callback(username),
secret='revoked-secret',
algorithm=config.algorithm,
expires_delta=None,
fresh=False,
user_claims=jwt_manager._user_claims_callback(username),
csrf=config.csrf_protect,
identity_claim_key=config.identity_claim_key,
user_claims_key=config.user_claims_key,
json_encoder=config.json_encoder)

令牌撤销

app.config[‘JWT_BLACKLIST_TOKEN_CHECKS’] = [‘access’, ‘refresh’]

创建我们的函数以检查令牌是否已被列入黑名单。在这简单情况下,我们将只存储在Redis的令JTI(唯一标识符)每当我们创建一个新令牌时(撤销状态为’false’)。这个 function将返回令牌的撤销状态。如果令牌没有 存在于这个商店,我们不知道它来自哪里(因为我们正在新添加 创建令牌到我们的商店,撤销状态为’false’)。在这种情况下 出于安全考虑,我们会考虑撤销令牌。

1
2
revoked_store = redis.StrictRedis(host='localhost', port=6379, db=0,
decode_responses=True)

1
2
3
4
5
6
7
@jwt.token_in_blacklist_loader
def check_if_token_is_revoked(decrypted_token):
jti = decrypted_token['jti']
entry = revoked_store.get(jti)
if entry is None:
return True
return entry == 'true'

产生token

1
2
3
4
5
6
7
access_token = create_access_token(identity=username)
将令牌存储在redis中,状态目前未被撤销。
我们可以使用`get_jti()`方法获取唯一标识符字符串
每个令牌。我们还可以在redis中设置这些令牌的到期时间,所以它们会在到期后自动删除。
我们将设定令牌过期后不久将自动删除的所有内容
access_jti = get_jti(encoded_token=access_token)
revoked_store.set(access_jti, 'false', ACCESS_EXPIRES * 1.2)

撤销视图

1
2
3
4
5
6
@app.route('/auth/access_revoke', methods=['DELETE'])
@jwt_required
def logout():
jti = get_raw_jwt()['jti']
revoked_store.set(jti, 'true', ACCESS_EXPIRES * 1.2)
return jsonify({"msg": "Access token revoked"}), 200

在令牌中存储和获取数据

自定义一个基类存储角色和用户id

1
2
3
4
5
class UserObject:
def __init__(self,id,username, role):
self.id = id
self.username = username
self.role = role

1
2
3
4
5
6
7
8
9
10
11
创建一个将在create_access_token时调用的函数
用来。它将采取任何传递到的对象create_access_token方法,让我们定义什么是自定义声明应添加到访问令牌中
@jwt.user_claims_loader
def add_claims_to_access_token(user):
return {'role': user.role,'id':user.id}


创建一个将在create_access_token时调用的函数用来。它将采取任何传递到的对象create_access_token方法,让我们定义什么标识应该是访问令牌的
@jwt.user_identity_loader
def user_identity_lookup(user):
return user.username

产生令牌

1
2
3
data = UserObject(id=user.id,username=username,role=user.role)
expires = datetime.timedelta(days=2)
access_token = create_access_token(identity=data, expires_delta=expires)

如何获取数据

1
2
3
username = get_jwt_claims()
user_id = get_jwt_claims()['id']
user_role = get_jwt_claims()['role']

最后更新: 2019年03月14日 14:30

原始链接: https://zem12345678.github.io/2019/03/14/flask-jwt-extended使用详解/

× 请我吃糖~
打赏二维码