Совместное использование flask_login и flask-JWT в REST API

Я новичок в flask, недавно узнал о flask_security/flask_login/flask_user.

Я хотел бы каким-то образом использовать flask_login вместе с flask-JWT для REST API.
По сути, я хотел бы иметь такие функции, как «запомнить меня», «забыл пароль» и т. д., из flask_login
При поиске , я обнаружил, что это невозможно сделать в том же представлении flask.

Кто-нибудь может подсказать, как это сделать?
Спасибо.


person penka_the_cow    schedule 14.06.2018    source источник


Ответы (1)


flask-login предоставляет обратный вызов request_loader именно для этой цели, для аутентификации запросов нестандартным способом.

В моем случае я добавил это в свою функцию create_app:

@login_manager.request_loader
def load_user_from_request(request):
    auth_headers = request.headers.get('Authorization', '').split()
    if len(auth_headers) != 2:
        return None
    try:
        token = auth_headers[1]
        data = jwt.decode(token, current_app.config['SECRET_KEY'])
        user = User.by_email(data['sub'])
        if user:
            return user
    except jwt.ExpiredSignatureError:
        return None
    except (jwt.InvalidTokenError, Exception) as e:
        return None
    return None

В противном случае я следовал этому руководству. , поэтому токен создается так (в функции входа):

token = jwt.encode({
'sub': user.email,
'iat':datetime.utcnow(),
'exp': datetime.utcnow() + timedelta(minutes=30)},
current_app.config['SECRET_KEY'])

Таким образом, вы можете просто использовать @login_required из flask-login вместо определения собственного декоратора для защиты представлений.

Я использовал PyJWT вместо Flask-JWT, так как кажется, что Flask-JWT больше не поддерживается.

person Kris    schedule 03.01.2019
comment
Чтобы добавить к этому, если вы используете flask-jwt-extended, который все еще активно поддерживается в отличие от flask-jwt, вы можете использовать встроенные методы проверки, поэтому вам не нужно дублировать логику JWT и по-прежнему получать преимущества остальная часть расширения: flask- jwt-extended.readthedocs.io/en/latest/ - person vimalloc; 03.01.2019
comment
Но можно ли использовать его вместе с flask-login? Похоже, что flask-jwt-extended предоставляет свои собственные декораторы для защиты функций просмотра. Конечно, это зависит от вашего варианта использования, но для меня главным было то, что я мог ввести jwt-аутентификацию в приложение, которое уже сильно зависит от flask-login. - person Kris; 04.01.2019
comment
Те ссылки, которые я предоставил, не являются декораторами. Это обычные функции, которые вы можете использовать внутри декорированной функции request_loader. Я не вникал в это слишком внимательно, но думаю, что они могли бы работать вместе. Теперь, если вы действительно хотите смешивать и сочетать два похожих расширения, это может быть другая история. - person vimalloc; 04.01.2019
comment
Я понимаю. Вы должны вызвать flask-jwt-extended из обратного вызова request_loader, чтобы проверить токен. - person Kris; 05.01.2019