2016-04-15 70 views
0

我已經開始與python-flaskangular和我已經使用this snippet來處理csrf。用ajax調用它總是給我403錯誤。我沒有得到,我在這裏做錯了什麼。 我已經經歷了很多答案,並嘗試了google search中的所有選項。但沒有運氣。我沒有得到我犯錯的地方。燒瓶和csrf標記

瓶代碼:

@app.route('/targetapi/', methods=['POST']) 
def fetch_targets(): 
    """ """ 
    data_dict = {} 
    acc_ids = request.args['acc_ids'] 
    data_dict['username'] = session.get('username') 
    data_dict['targets'] = some_func(acc_ids) 
    return jsonify(data_dict) 

角碼: HTML頁:

<input name="_csrf_token" type=hidden ng-model="csrf_token" ng-init="csrf_token='{{ csrf_token() }}'" > 

Ajax調用:

$http({ 
     method : "POST", 
     url : '/targetapi/', 
     headers : { xsrfHeaderName: 'X-CSRFToken', xsrfCookieName : csrf_token }, 
     data : { acc_ids : accountIDs }     
}) 

不知道爲什麼我得到403禁止響應:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>403 Forbidden</title> 
<h1>Forbidden</h1> 
<p>You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.</p> 

* Chrome-Developer工具粘貼的響應

+0

你如何設置Flask來防止CSRF?瓶,跆拳道?燒瓶SeaSurf?其他一些方法? –

+0

@JakubP。 - flask_wtf – trex

+0

假設1)您仔細閱讀了所有http://flask-wtf.readthedocs.org/en/latest/csrf.html和2)AJAX調用實際上具有X-CSRFToken標頭,其中具有適當的值在Flask模板中插入的HTML頁面,以及3)您的flask_wtf配置沒有從默認(http://flask-wtf.readthedocs.org/en/latest/config.html)更改,那麼我沒有線索...如果你可以把一個最小的工作演示放在一起,我可以嘗試在我自己的機器上進行調試......(注意0.9.0版本的要求) –

回答

1

檢查Chrome是否在發佈請求之前發送選項請求。如果是這樣,你可以嘗試這樣的事情:

from flask import current_app 

    @app.route('/targetapi/', methods=['POST', 'OPTIONS']) 
    def fetch_targets(): 
     if request.method=='OPTIONS': 
      response = current_app.make_default_options_response() 
     else: 
      data_dict = {} 
      acc_ids = request.args['acc_ids'] 
      data_dict['username'] = session.get('username') 
      data_dict['targets'] = some_func(acc_ids) 
      return jsonify(data_dict)