Flask Restless CSRF 豁免认证 URL
Posted
技术标签:
【中文标题】Flask Restless CSRF 豁免认证 URL【英文标题】:Flask Restless CSRF exempt authentication URL 【发布时间】:2016-10-03 17:10:32 【问题描述】:我将 Flask Restless 0.17 和 Flask JWT 用于应用程序的 API 部分。在应用程序的前端,我使用 Flask WTF 及其 CSRF 保护。
这会导致 Flask Restless 出现问题,因为 WTF 期望在每个视图上都有一个 CSRF 令牌。我可以通过免除 API 的蓝图在我创建的端点上解决此问题,但无法弄清楚如何将其应用于 Flask JWT 创建的 /auth URL。
API 初始化:
def init_app(app):
def authenticate(username, password):
user = User.query.filter_by(username=username).scalar()
if user and username == user.username and \
User.check_password(user, password):
return user
return None
def load_user(payload):
user = User.query.filter_by(id=payload['identity']).scalar()
return user
jwt = JWT(app, authenticate, load_user)
@jwt_required()
def auth_func(**kw):
pass
manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db)
bp = manager.create_api_blueprint(
MyModel,
methods=['GET'],
url_prefix='/api/v1',
preprocessors=dict(GET_SINGLE=[auth_func],
GET_MANY=[auth_func]),
results_per_page=10,
)
# Here I can exempt this API endpoint.
# But how do I exempt /auth which is created by Flask JWT?
csrf_protect.exempt(bp)
app.register_blueprint(bp)
【问题讨论】:
【参考方案1】:我不知道如何像上面那样做,所以我关闭了 WTF CSRF 保护,然后在我们不在 API 端点上时启用它。
settings.py
WTF_CSRF_CHECK_DEFAULT = False
app.py
def register_csrf(app):
"""
Only enable CSRF protection on URLs that are not API related.
:param app: The app
"""
@app.before_request
def check_csrf():
if request.endpoint != 'api':
csrf_protect.protect()
【讨论】:
以上是关于Flask Restless CSRF 豁免认证 URL的主要内容,如果未能解决你的问题,请参考以下文章
Flask-Restful 优于 Flask-Restless
Flask-Restless 的复杂路由(例如“忘记密码”)