Django djangorestframework-jwt
安裝
pip install djangorestframework-jwt
配置
REST_FRAMEWORK = {
# 默認 jwt 處理方式
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
import datetime
JWT_AUTH = {
# 過期時間 1天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
路由
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
# 登錄
path('login/',obtain_jwt_token)
]
訪問路由輸入賬號和密碼,
響應
{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InJvb3QiLCJleHAiOjE1OTg0OTU0MjgsImVtYWlsIjoiIn0.c08D8vR8bDlvuvohlRvmqzeoEZww8W4O8D2y_5F5SGM",}
自定義響應信息
首先我們考慮 這是DRF-jwt
默認生成token
的方式 ,我覺的不夠 ,因為只是給返回了token
,我還想要 用戶名和 用戶id。那么我們就得需要自定義了。
DRF-jwt
其實已經給我提供好了結口。
配置
JWT_RESPONSE_PAYLOAD_HANDLER
JWT_AUTH = {
# jwt 過期時間
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 自定義 響應信息
'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler'
}
在當前app下新建utils.py
def jwt_response_payload_handler(token, user=None, request=None):
'''
自定義返回認證信息
:param token: jwt認證token
:param user: 用戶id
:param request: 請求對象
:return:
'''
return {
"token": token,
'id': user.id,
'username': user.username
}
我們在發請求看一下
自定義多條件登錄
這會我們在考慮一下現在我們只能用用戶名登錄,當前用戶數據模型是有手機號的。所以我想用手機號也能登錄,所以我要自定義,驗證規則。
def get_user_by_account(username):
return User.objects.filter(Q(username=username) | Q(mobile=username)).first()
class UsernameMobileAuthBackend(ModelBackend):
'''
自定義 登錄驗證 多加了一個 mobile(手機號)
'''
# authenticate 重寫
def authenticate(self, request, username=None, password=None, **kwargs):
user = get_user_by_account(username)
print(user,'>>>>>>>>>>>>>')
if user is not None and user.check_password(password):
return user
配置
# jwt 自定義用戶數據模型
AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]