1. 程式人生 > >React + Axios + Django前後端分離CSRF問題解決方案

React + Axios + Django前後端分離CSRF問題解決方案

想直接看程式碼的移步GitHub:

CSRF 403 Forbidden這個問題從我剛開始做這個前端登入介面的時候就遇到了,但為了不耽誤學習進度關閉了Django的CSRF驗證選項。
現在快要做完了,就抽出了半天時間來解決了這個問題。
並不難其實,就是網上的資料有點不靠譜= =

Django的配置

額……雖然說是配置吧,但其實沒什麼說的……重點可能就是 @ensure_csrf_cookie 這個修飾符吧(一看到@我就想起來春招面試面試官問我修飾符的作用)。放個程式碼幫助理解下。

#url.py
urlpatterns = [
    path('Auth/', include('LoginAuth.urls'
)), path('admin/', admin.site.urls), ] #view.py @ensure_csrf_cookie def login_authentication(request): if request.method != "POST": return HttpResponse() login_state = {} .....

因為完全的靜態網頁嘛,所以網上常見的{{%csrftoken}}這種方法就不可行了。
對於這種情況,django官方給出瞭解決方案:
這裡寫圖片描述
就是用這個 ensure_csrf_cookie,通過cookies的方式將csrftoken發過來。
切記不要將CSRF_COOKIE_SECURE設定為True,否則前前端讀取不到這個token。

前端的配置

預設的token在cookies中名字為csrftoken。
因為前後端分離,所以在post之前需要先get一下來獲取包含csrftoken的cookies。

axios.get('/Auth/Register')
          .then(()=>{
                      this.usrInfoSending(new Date().getTime())
                    })
          .catch((err) => {
                      this.networkErr(err);
          })
;

這樣get一下之後便得到了csrftoken,便可以正常的post資料了。
忘了說一下,得到的token需要放到Header裡,名字為 X-CSRFToken (這個坑了我好久,最開始查到的名字是錯的,怎麼也驗證不過)

    axios.post('/Auth/Register',
            {
                userName: this.state.userName,
                userPassWD: this.state.userPassWD,
                currentTime: timeStamp
            },
            {
                headers:{
                    'X-CSRFToken':cookies.get('csrftoken')
                }
            })
            .then((response) => {
            ......

cookies的獲取我直接用了universal-cookie這個庫,感興趣的可以去看看。

基本就這些~