Как перейти от использования 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/