5

我是flask新手,最近了解了flask_security/flask_login/flask_user。

我希望我能以某种方式将 flask_login 和 flask-JWT 一起用于 REST API。
基本上,我希望从 flask_login 中获得记住我、忘记密码等功能
。搜索后,我发现它无法在同一个烧瓶视图上完成。

有人可以指导我,怎么做?
谢谢。

4

1 回答 1

7

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'])

这样你就可以只使用来自 flask-login 的 @login_required 而不是定义一个自定义装饰器来保护视图。

我使用 PyJWT 而不是 Flask-JWT,因为 Flask-JWT 似乎已停产。

于 2019-01-03T10:19:34.143 回答