Flask Restless CSRF освобождает URL аутентификации
Я использую Flask Restless 0.17 и Flask JWT для API-части приложения. В интерфейсе приложения я использую Flask WTF и его защиту CSRF.
Это создает проблемы с Flask Restless, так как WTF ожидает токен CSRF при каждом просмотре. Я могу обойти это на конечных точках, которые я создаю, освобождая схему API, но не могу понять, как применить это к URL, созданному Flask JWT /auth.
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()