Как перейти от использования Flask-JWT к PyJWT в моем приложении?

Я хочу отказаться от использования Flask-JWT, поскольку он больше не обновляется. Моя проблема в том, что я не уверен, как достичь некоторых функций, которые мне дала Flask-JWT. Например:

jwt = JWT(app, verify, identify)

С Flask-JWT я мог передать приложение фляги, метод аутентификации и identify функция, которая делает следующее:

def identify(payload):
    user_id = payload['identity']
    return {"user_id": user_id}

Теперь моя главная проблема в том, что я не до конца понимаю, что такое декоратор @jwt_required() делает и как я мог воспроизвести его с помощью PyJWT. Так что, если бы у меня была следующая функция:

class PrivateResource(Resource):
    @jwt_required()

    def get(self):
        return {"badge_number": 445566}

Как я мог сделать ту же функцию, что и @jwt_required() при использовании PyJWT?

2 ответа

Похоже, что он выполняет типичную проверку на наличие самого токена. Возможно, вы могли бы легко изменить это, вызвав вместо этого токен PYJWT.

def _jwt_required(realm):
    """Does the actual work of verifying the JWT data in the current request.
    This is done automatically for you by `jwt_required()` but you could call it manually.
    Doing so would be useful in the context of optional JWT access in your APIs.
    :param realm: an optional realm
    """
    token = _jwt.request_callback()

    if token is None:
        raise JWTError('Authorization Required', 'Request does not contain an access token',
                       headers={'WWW-Authenticate': 'JWT realm="%s"' % realm})

    try:
        payload = _jwt.jwt_decode_callback(token)
    except jwt.InvalidTokenError as e:
        raise JWTError('Invalid token', str(e))

    _request_ctx_stack.top.current_identity = identity = _jwt.identity_callback(payload)

    if identity is None:
        raise JWTError('Invalid JWT', 'User does not exist')


def jwt_required(realm=None):
    """View decorator that requires a valid JWT token to be present in the request
    :param realm: an optional realm
    """
    def wrapper(fn):
        @wraps(fn)
        def decorator(*args, **kwargs):
            _jwt_required(realm or current_app.config['JWT_DEFAULT_REALM'])
            return fn(*args, **kwargs)
        return decorator
    return wrapper

Возможно проверить колбу JWT продлен. Это улучшенное расширение jwt для колб (IMO), которое все еще активно поддерживается. http://flask-jwt-extended.readthedocs.io/en/latest/

Другие вопросы по тегам