Vue結合Django-Rest-Frameword結合實現登入認證(一)
阿新 • • 發佈:2020-09-21
>作者:小土豆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`是關於使用者的許可權配置,如果沒有配置該項的話就是允許使用者無限制訪問,不管我們的請求是被認證或未認證的。
> 這塊可以看 [