1. 程式人生 > >Vue結合Django-Rest-Frameword結合實現登入認證(一)

Vue結合Django-Rest-Frameword結合實現登入認證(一)

>作者:小土豆biubiubiu > >部落格園:https://www.cnblogs.com/HouJiao/ > >掘金:https://juejin.im/user/2436173500265335 > > >微信公眾號:土豆媽的碎碎念(掃碼關注,一起吸貓,一起聽故事,一起學習前端技術) > >作者文章的內容均來源於自己的實踐,如果覺得有幫助到你的話,可以點贊❤️給個鼓勵或留下寶貴意見 # 前言 最近需要做一個`登入認證`的功能,所以想將整個的過程做一個記錄,方便以後回頭檢視,同時希望給我遇到同樣問題的同學一些參考。 > 因為認證是後端的功能,所以我這個不專業的前端在實現這個功能的時候不會深究太多。所以在記錄的過程中沒有過多的原理,著重記錄實現過程和這個過程中遇到的問題以及解決方案。 > 如果對登入這塊前後端流程原理不太懂的,可以先做一點功課,或者直接看我的整個操作和結果,看完之後會從結果和現象出發,在去理解學習登入認證原理就會更容易。 # 初始的環境介紹 ### 前端框架 框架:`Vue` HTTP庫:`axios` ### 後端專案 後端框架:基於`python`的`django`框架 WEB API:`rest-framework` 伺服器: `centos` 資料庫:`PostgreSQL` python版本:`2.7.5` django版本:`1.10.1` ### 關於後端資料庫的一些說明 資料庫使用的是`PostgreSQL`,並且已經對資料庫表進行了同步,命令為:`python manage.py migrate`。 ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d6e22b63be9748dd885dabb785db83e1~tplv-k3u1fbpfcp-zoom-1.image) 資料庫進行同步以後,會生成`10`相關的資料表。 ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/181b003cac0749f5b6fc9dc103c21c63~tplv-k3u1fbpfcp-zoom-1.image) 需要關注的就是`auth_user`表這個表,它是`django`框架生成的使用者表,後面就使用這個表儲存使用者的資訊。 我們檢視一下這個表結構。 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d87bf0c947f4bc7a43a69f9b366acd6~tplv-k3u1fbpfcp-zoom-1.image) 表裡面暫時沒有什麼資料。 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6b015c2e66e5424791f670fdaec544c7~tplv-k3u1fbpfcp-zoom-1.image) 接著我們來建立一個使用者,用於後期的登入測試:`python manage.py createsuperuser` ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2a5586cb2bfd4b0989df673f320820a9~tplv-k3u1fbpfcp-zoom-1.image) 使用者建立成功,此時在去查詢資料表,就有一條使用者資訊了。 ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/15c5c11eeb064d16b330e56be278a85c~tplv-k3u1fbpfcp-zoom-1.image) 接下來就是登入驗證的實現了。 # 後端Django專案配置 ### Django登入認證配置 首先我們需要在`setting.py`檔案的`INSTALLED_APPS`配置登入認證的`APP`。 ```python INSTALLED_APPS = [ ... 'rest_framework.authtoken' ] ``` ### 設定全域性的認證方案 接著在`setting.py`中配置全域性身份認證方案。 ```python # 設定全域性身份認證方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # token認證 ) } ``` ### 資料庫同步 上面的配置完成需要進行資料庫同步:`python manage.py migrate` ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bd597492a13b40408e66cd336afb889a~tplv-k3u1fbpfcp-zoom-1.image) 在此檢視資料庫: ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/07c2b9e979454030ba77a043629456f7~tplv-k3u1fbpfcp-zoom-1.image) 發現會多出來一個名為`authtoken_token`的資料表,這個表就是和使用者認證相關的資料表。 ### 簡單測試 我們已經配置好了全域性的認證方式,那按道理來說,現在任意訪問後端的某個`API`就會出現為`HTTP 401未經授權`這樣的錯誤,那我們來試一試。 ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2cbfc8d241a44ed585ad382280663f9b~tplv-k3u1fbpfcp-zoom-1.image) 那結果發現請求還是可以正常發出。 這塊在網上搜索了很久,看到有網友說關於`setting`設定的`全域性身份認證方案`配置有問題,正確的配置是 ```javascript # 設定全域性身份認證方案 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # token認證 ) } ``` `DEFAULT_PERMISSION_CLASSES`是關於使用者的許可權配置,如果沒有配置該項的話就是允許使用者無限制訪問,不管我們的請求是被認證或未認證的。 > 這塊可以看 [