#Django djangorestframework-jwt


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)
]

訪問路由輸入賬號和密碼,

image-20200826102952132

響應

{ "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
    }

我們在發請求看一下

image-20200826103742108

自定義多條件登錄

這會我們在考慮一下現在我們只能用用戶名登錄,當前用戶數據模型是有手機號的。所以我想用手機號也能登錄,所以我要自定義,驗證規則。

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',
]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM