0

We have wrote a code which helps to extends the jwt token life by saving it in redis/db. The code written works for some number of requests and suddenly throughs error for 401.

USING:

  • Flask-AppBuilder==4.3.0
  • Flask-JWT-Extended==4.4.4
  • redis==4.5.1
class RedisTokenStore:
    """
    @classname: RedisTokenStore
    @Description: It is used to store and manage tokens in redis
    """

    def __init__(self) -> None:
        self.redis_store = redis.StrictRedis(
            host=config.REDIS_HOST, port=config.REDIS_PORT, db=0, decode_responses=True
        )

    def set_value(self, key, value, expiry) -> None:
        """Set jwt token value and permissions object"""
        self.redis_store.set(key, value, expiry)

    def update_expiry(self, key, prolongation) -> None:
        """Update expiry of jwt token"""
        self.redis_store.expire(key, prolongation)

    def get_value(self, key):
        """Get value of jwt token"""
        return self.redis_store.get(key)

    def get_ttl(self, key):
        """Get time to left of jwt"""
        return self.redis_store.ttl(key)

    def delete(self, key):
        """Delete the keys from redis store"""
        self.redis_store.delete(key)
__jwt = appbuilder.sm.jwt_manager


@__jwt.token_in_blocklist_loader
def check_if_token_is_revoked(jwt_header, jwt_payload):
    """
    Method_name: check_if_token_is_revoked
    Description: Check if token is avaialbe in token store.
                 if not available returns True ie. token is revoked/expired
                 else get total time left to expire token
                 if ttl < refresh token time : => update expiry time.
    Params:
        @REFRESH_TOKEN_TIME: instead of extend time of expiry for each request.
                 check if time if going below REFRESH_TOKEN_TIME value then only extend.
                 it will reduce extend time at each request load.
        @jwt_payload: Json object with token details.

    """

    jti = jwt_payload["jti"]
    user_id = jwt_payload["user_id"]
    entry = token_store.get_value(jti)
    if entry is None:
        return True
    else:
        ttl = token_store.get_ttl(jti)
        if ttl < config.REFRESH_TOKEN_TIME:
            token_store.set_value(jti, "false", config.TOKEN_LIFE)
            token_store.update_expiry(f"{user_id}_permissions", config.TOKEN_LIFE)
        return entry == "true"

This functions works fine for some requests. after that it stops to call token_in_blocklist_loader and returns 401 response in between.

omkar more
  • 105
  • 2
  • 10

0 Answers0