Flask-praetorian,无法将身份验证 header 传递给受保护的端点
Flask-praetorian, not able to pass auth header to protected endpoint
我正在使用 flask-praetorian 以增加我的应用程序的安全性。
我有两条路线:一条用于 /login 和一个名为 /profile 的受保护端点。登录路由工作正常,它从表单中获取用户名和密码,我能够将信息传递给守卫 object 并对其进行身份验证以获取新令牌,但我无法将此令牌传递给为受保护端点请求 headers。
我尝试使用“session”来添加 header、'make_response' 方法和重定向(url_for()),但每次它到达endpoint 没有正确的 header 导致错误。
代码如下:
@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')
(flask-praetorian 包的作者在这里)
这里的问题是您只是从 login()
方法调用 profile()
方法。调用 pack_header_for_user
实际上不会将正确的 auth header 放入当前请求上下文中。相反,它只是创建一个可以放入请求中的 header 字典(但很好地返回为 json)。您可以可以通过修改 flask 的请求上下文将令牌插入当前请求,但这不是最好的方法。
执行此操作的正确方法是让您的 login
路由在您的响应负载中包含令牌,然后从您的前端代码再次调用配置文件端点并将令牌添加到请求中 header.
真的,我认为您最好使用 flask-security 等不同的软件包。 flask-praetorian 包旨在与纯 API 一起使用,我没有对标准烧瓶页面进行任何测试或原型设计。
我正在使用 flask-praetorian 以增加我的应用程序的安全性。
我有两条路线:一条用于 /login 和一个名为 /profile 的受保护端点。登录路由工作正常,它从表单中获取用户名和密码,我能够将信息传递给守卫 object 并对其进行身份验证以获取新令牌,但我无法将此令牌传递给为受保护端点请求 headers。 我尝试使用“session”来添加 header、'make_response' 方法和重定向(url_for()),但每次它到达endpoint 没有正确的 header 导致错误。
代码如下:
@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')
(flask-praetorian 包的作者在这里)
这里的问题是您只是从 login()
方法调用 profile()
方法。调用 pack_header_for_user
实际上不会将正确的 auth header 放入当前请求上下文中。相反,它只是创建一个可以放入请求中的 header 字典(但很好地返回为 json)。您可以可以通过修改 flask 的请求上下文将令牌插入当前请求,但这不是最好的方法。
执行此操作的正确方法是让您的 login
路由在您的响应负载中包含令牌,然后从您的前端代码再次调用配置文件端点并将令牌添加到请求中 header.
真的,我认为您最好使用 flask-security 等不同的软件包。 flask-praetorian 包旨在与纯 API 一起使用,我没有对标准烧瓶页面进行任何测试或原型设计。