【问题标题】:Disable WTForms CSRF if access through certain routes如果通过某些路由访问,则禁用 WTForms CSRF
【发布时间】:2021-09-05 12:19:38
【问题描述】:
我正在使用 Flask-Login 和 Flask-WTF 进行 CSRF 保护。我想为 API 添加一些路由。由于request_loader 将用于 API(标头令牌,无 cookie),我想在这些路由上禁用 CSRF。
但是,一旦通过身份验证,用户之间就没有区别了。无法判断他们是使用带有user_loader 的cookie 还是使用带有request_loader 的标头登录的。
如何仅在 API 路由中使用表单时禁用 CSRF?或者如何防止 cookie 用户访问 API 路由?
【问题讨论】:
标签:
python
flask
flask-wtforms
wtforms
flask-login
【解决方案1】:
使用表单的Meta object,或者初始化meta参数来控制CSRF之类的东西。例如,如果您的 API 在 api 蓝图下:
from flask_wtf import FlaskForm
class APIForm(FlaskForm):
class Meta:
@property
def csrf(self):
return request.blueprint != "api"
class DocumentForm(APIForm):
...
# Or for a one-off use:
form = UserForm(meta={"csrf": request.blueprint != "api"})
或其他检查,具体取决于您的要求。
无法判断他们是否使用 cookie 登录...
您可以在加载用户的回调中做任何您想做的事情。例如,您可以在您的request_loader 中记录g.user_from_header = True。然后,您可以基于此启用csrf 属性,而不是基于蓝图。或者在 API 蓝图中添加一个 before_request 处理程序以在未设置时中止。
@login_manager.request_loader
def user_from_request(request):
user = ...
g.user_from_header = True
return user
@api_bp.before_request
def require_user_from_header():
if not g.get("user_from_header", False):
abort(401)