Flask-praetorian,无法将auth标头传递到受保护的端点

时间:2019-12-28 19:13:49

标签: flask header flask-wtforms flask-praetorian

我使用flask-praetorian来向我的应用程序添加安全性。

我有两条路线:一条用于/ login,一条受保护的端点/ profile。 Login路由工作正常,它从表单中获取用户名和密码,无法将信息传递给保护对象并对其进行身份验证以获取新令牌,但是无法将此令牌传递给请求头。受保护的端点。 我尝试使用“会话”添加标头,“ make_response”方法和redirect(url_for()),但是每次到达端点时,它都不会在没有正确标头的情况下引起错误。

以下代码:

@user.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()

    if request.method == 'POST':
        username = form.username.data
        password = form.password.data
        user = guard.authenticate(username, password)
        token = guard.pack_header_for_user(user)
        resp = make_response(profile())
        resp.headers['Authorization'] = token['Authorization']
        return resp

    else:

        return render_template('login.html', form=form)


@user.route('/profile')
@auth_required
def profile():

    return render_template('profile.html')

1 个答案:

答案 0 :(得分:0)

(此处为flask-praetorian软件包的作者)

这里的问题是,您只是从profile()方法中调用login()方法。调用pack_header_for_user实际上不会在当前请求上下文中放置正确的auth标头。相反,它只是创建可以放入请求中的标头字典(但很好地返回为json)。您可以通过修改flask的请求上下文来 将令牌塞入当前请求,但这不是最好的方法。

执行此操作的正确方法是让login路由将令牌包含在响应有效负载中,然后通过将前端令牌添加到请求标头中,从前端代码再次调用配置文件端点。< / p>

真的,我认为您最好使用flask-security之类的其他程序包。 flask-praetorian软件包旨在与纯API一起使用,我还没有使用标准flask页面进行任何测试或制作原型。