2016-06-03 2 views
1

Я использую Flask Restless 0.17 и Flask JWT для части API приложения. В интерфейсе приложения я использую Flask WTF и его защиту CSRF.Flocks Restless CSRF освобожденный аутентификационный URL

Это создает проблемы с Flask Restless, поскольку WTF ожидает маркер CSRF на каждом представлении. Я могу обойти это на конечных точках, которые я создаю, освобождая план API, но не могу понять, как применить это к созданному URL-адресу Flask JWT/auth.

API initilization:

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) 

ответ

0

Я не мог понять, как это сделать, как выше, так что вместо этого я выключил защиту 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() 
Смежные вопросы