Django(72)Django認證系統庫--djoser
djoser是什麼?
作用:Django
認證系統的REST
實現。djoser
庫提供了一組Django Rest Framework
檢視,用於處理註冊、登入、登出、密碼重置和帳戶啟用等基本操作。它適用於自定義使用者模型。
djoser
並沒有重寫Django
程式碼(例如PasswordResetForm
),而是重新實現了一些東西,以更好地適應單頁應用程式體系結構。
環境準備與安裝
支援的python版本
- Python 3.5
- Python 3.6
- Python 3.7
- Python 3.8
支援的Django版本
- Django 1.11
- Django 2.2
- Django 3.1
支援的drf版本
- Django Rest Framework 3.9
- Django Rest Framework 3.10
- Django Rest Framework 3.11
支援的身份驗證後端
- 基於drf的身份認證Token
- 基於
django-rest-framework-simplejwt
的JWT認證
可用端點
- /users/
- /users/me/
- /users/confirm/
- /users/resend_activation/
- /users/set_password/
- /users/reset_password/
- /users/reset_password_confirm/
- /users/set_username/
- /users/reset_username/
- /users/reset_username_confirm/
- /token/login/ (Token Based Authentication)
- /token/logout/ (Token Based Authentication)
- /jwt/create/ (JSON Web Token Authentication)
- /jwt/refresh/ (JSON Web Token Authentication)
- /jwt/verify/ (JSON Web Token Authentication)
安裝
pip install -U djoser
如果你打算使用JWT認證,你還需要安裝下面的包
pip install -U djangorestframework_simplejwt
最後,如果您打算使用基於第三方的身份驗證,例如facebook
,則需要安裝社交身份驗證應用程式django
,其中包括:
pip install -U social-auth-app-django
配置資訊
在INSTALLED_APPS
裡新增如下程式碼:
INSTALLED_APPS = (
'django.contrib.auth',
(...),
'rest_framework',
'djoser',
(...),
)
在urls.py
中新增如下程式碼
urlpatterns = [
(...),
url(r'^auth/', include('djoser.urls')),
]
官網上強調了:預設情況下,HTTP Basic Auth
驗證策略採用Django Rest Framework
。並且強烈反對且不提供任何對basic auth
的明確支援。我們應該按照“身份驗證後端”中的說明來自定義身份驗證後端。
測試程式
該庫還提供了一個獨立的測試應用程式,讓我們瞭解基本的工作方式。在將djoser
整合到後端應用程式之前,我們有必要去了解下
接下來我們會模擬最簡單的流程:註冊使用者、登入和登出。
環境準備
克隆git上的專案,並且在虛擬環境中安裝djoser
git clone [email protected]:sunscrapers/djoser.git
克隆完專案的目錄如下:
安裝專案中的依賴包(虛擬環境用的poetry)
poetry install
安裝完成後,cd到testproject目錄中,執行遷移命令
python manage.py migrate
最後直接通過pycharm啟動專案,環境就算準備好了
建立使用者
使用介面測試工具postman
或者其他工具,輸入url和data,就能訪問介面了
可以看到我們已經成功建立了一個id為2的使用者
未登入查詢使用者資訊
剛才我們只是建立了一個新使用者,但是沒有進行登入操作,此時我們去查使用者資訊,肯定是不行的
正如我們所看到的,我們無法在不登入的情況下訪問使用者配置檔案。
使用者登入
我們訪問使用者登入介面,就可以返回一個token
登入後查詢使用者資訊
然後我們在headers
中新增Authorization
,對應的值為Token 剛剛返回的token值
,注意中間要有一個空格
之後我們再訪問查詢使用者資訊介面,就能正確返回使用者資訊了
退出登入
最後訪問退出登入介面,就可以退出登入了
退出後再查詢使用者資訊
當我們退出登入後,再次用之前的token去查詢使用者資訊後就會報錯
身份驗證後端
djoser有基於以下兩種的認證方式
- Token Based Authentication
- JSON Web Token Authentication
Token Based Authentication使用方式
在INSTALLED_APPS
中新增rest_framework.authtoken
INSTALLED_APPS = [
'django.contrib.auth',
(...),
'rest_framework',
'rest_framework.authtoken',
'djoser',
(...),
]
然後在urls.py
配置路徑
urlpatterns = [
url(r'^auth/', include('djoser.urls.authtoken')),
]
再在settings.py
中的REST_FRAMEWORK
配置中新增rest_framework.authentication.TokenAuthentication
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
最後執行遷移命令,遷移auth
和authtoken apps
:
python manage.py migrate
JSON Web Token Authentication
在settings.py
中的REST_FRAMEWORK
配置中新增rest_framework_simplejwt.authentication.JWTAuthentication
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
(...)
),
}
然後配置django-rest-framework-simplejwt使用授權時的請求頭中的請求標識,格式為:JWT <access_token>
,配置資訊如下:
SIMPLE_JWT = {
'AUTH_HEADER_TYPES': ('JWT',),
}
最後在urls.py
配置路徑
urlpatterns = [
(...),
url(r'^auth/', include('djoser.urls')),
url(r'^auth/', include('djoser.urls.jwt')),
]