React + Axios + Django前後端分離CSRF問題解決方案
阿新 • • 發佈:2019-01-02
想直接看程式碼的移步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這個庫,感興趣的可以去看看。
基本就這些~