之前接收一個老項目,版本迭代的時候,發現了一個問題,用戶在登出的時候,再次登錄時,報400錯誤,
The CSRF session token is migging.
查了查代碼,才發現問題。
這個flask項目是用flask_wtf的csrf 創建的csrf_token的時候,
#創建一個csrf_token值
csrf_token=csrf.generate_csrf()
自動會在session中存放一個值,項目的session存放在redis中,則redis中存在該值。
在cookie中,前開發工程師也把csrf_token存放了一份在cookie中,
# 設置cookie值
resp.set_cookie("csrf_token", csrf_token)
在項目中使用flask_wtf的CSRFProtect(app)進行保護的時候,實則是從session中讀取csrf_token值,與前端請求數據中的headers中傳過來的csrf_token進行比較。
當登出清除session時,csrf_token值也一起刪除了,而瀏覽器再次加載頁面時,由於瀏覽器緩存機制,是通過瀏覽器的緩存訪問頁面,並未經過後臺,所以不會再生成csrf_token,也不會存放在redis的session中,導致csrf機制報錯.
當然,清空緩存,刷新後,則可以再次登錄,但這不是個解決辦法。
在不破壞原有代碼體系上,即 依舊使用flask_wtf的csrf機制,
可以在清空session前,獲取csrf_token的值,清空後再加上。
csrf_token=session.get('csrf_token')
session.clear()
session['csrf_token']=csrf_token