1. 程式人生 > 其它 >Django(72)Django認證系統庫--djoser

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',
    ),
}

最後執行遷移命令,遷移authauthtoken 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')),
]