Django(75)django-rest-framework-simplejwt

前言

由於之前我們一直使用的django-rest-framework-jwt 這個庫,但是作者在17年的時候就已經不再維護了(有部分bug沒有解決),所以我們也就不用了,目前我們使用django-rest-framework-simplejwt
 

介紹

Simple JWTDjango REST Framework提供了JSON Web TOKEN身份驗證。並且借鑒了DRF中的另一個JSON web token庫和django-rest-framework-jwt
 

安裝

1.使用以下pip命令安裝

pip install djangorestframework-simplejwt

 

2.然後我們在settings.py中認證類

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
    ...
}

 

3.我們在根urls.py中配置路由視圖TokenObtainPairViewTokenRefreshView

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ...
]

 

4.如果需要使用本地化,那麼只需把rest_framework_simplejwt加入到INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'rest_framework_simplejwt',
    ...
]

 

驗證

最後我們使用介面工具驗證simple jwt是否能正常工作,訪問//127.0.0.1:8000/api/token/

可以看到返回了accessrefresh兩個token

  • access:默認5分鐘的有效期
  • refresh:當access過期了,就需要傳入refresh欄位,重新刷新token,訪問//127.0.0.1:8000/api/token/refresh/


 

配置資訊解釋

settings.py中可以配置一些默認的資訊

# Django project settings.py

from datetime import timedelta

...

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),   # 設置token有效時間
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),  # 刷新token有效時間
    'ROTATE_REFRESH_TOKENS': False,  
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,  # 設置為True會在用戶登錄時,更新user表中的last_login欄位

    'ALGORITHM': 'HS256',  # 加密演算法
    'SIGNING_KEY': settings.SECRET_KEY,  # 簽名密鑰
    'VERIFYING_KEY': None,  # 驗證密鑰,用於驗證生成令牌的內容
    'AUDIENCE': None,  # 設置為None時,此欄位將從token中排除,並且不會進行驗證
    'ISSUER': None,  # 設置為None時,此欄位將從token中排除,並且不會進行驗證
    'JWK_URL': None,  # 設置為None時,此欄位將從token中排除,並且在驗證期間不使用
    'LEEWAY': 0,  # 用來給到期時間留一些餘地

    'AUTH_HEADER_TYPES': ('Bearer',),  # 認證的標籤頭,類似jwt token中的jwt
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',  # 身份驗證的授權標頭名稱
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',  # 生成token中聲明將用於存儲用戶標識符  
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',  # 用於存儲token類型的聲明名稱

    'JTI_CLAIM': 'jti',  # 用於存儲令牌的唯一標識符的聲明名稱

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

 

實戰項目登錄介面實現

Tags: