CSRF token is incorrect after login in SPA, but correct after page refresh

断了今生、忘了曾经 提交于 2019-12-12 10:14:34

问题


We make react SPA with django-rest-framework on backend and use django-rest-auth for user authentication.

When user has logged in, we show him form for change profile data. When user submit this form, we take csrf token from cookie in login response, and put them in request X-CSRFToken header. Server responses that token is missing or incorrect.

If user refreshed the page, and repeated the same actions, csrf token is correct and profile data is updated.

How to solve this problem and why it occurs?


回答1:


It looks like this is happening:

  • The login is successful
  • The cookie+token is created by the CSRF API and returned to the endpoint
  • The ready state executes some code not executed after the API response
  • The certificate is validated and the cookie+token is set in the database/app config/server-side cache during a GET request and/or by the ready state callback

Since there is no GET request until the refresh, the cookie+token is not centrally stored until then. Add a request to mimic what happens during the GET, then store it where it is currently being accessed for subsequent requests.

References

  • Issues with CSRF token and how to solve them | SAP Blogs

  • Why refresh CSRF token per form request? - Information Security Stack Exchange

  • CSRF Protection — Flask-WTF 0.14

  • CSRFGuard 3 Configuration - OWASP

  • Spring Security: Cross Site Request Forgery (CSRF)

  • Cross Site Request Forgery protection | Django documentation | Django

  • XSRF/CSRF Prevention in ASP.NET MVC and Web Pages | Microsoft Docs

  • Cross-Site Request Forgery is dead!

  • Still think you don't need HTTPS?



来源:https://stackoverflow.com/questions/40904326/csrf-token-is-incorrect-after-login-in-spa-but-correct-after-page-refresh

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!