Django(75)django-rest-framework-simplejwt
前言
由於之前我們一直使用的django-rest-framework-jwt
這個庫,但是作者在17年的時候就已經不再維護了(有部分bug沒有解決),所以我們也就不用了,目前我們使用django-rest-framework-simplejwt
介紹
Simple JWT
為Django 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
中配置路由視圖TokenObtainPairView
和 TokenRefreshView
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/
可以看到返回了access
和refresh
兩個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),
}