django項目之配置jwt的token登錄2


1、安裝jwt                                                                                                   

pip install djangorestframwork-jwt

2、修改配置文件dev.py                                                                              

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
import datetime
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),    # 設置jwt的認證過期時間
}

3、注冊路由                                                                                                

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('login/', obtain_jwt_token),   # jwt中提供了一個認證,直接導入后使用obtain_jwt_token視圖即可
]

4、此時可以使用postman 進行接口測試                                                      

 

 

     如上圖即,后台接口已經ok

 

5、jwt的返回只提供了一個token返回,如果想要返回其他字段,需要進行改造   

  再對應模塊下面的utils文件中改寫jwt_response_payload_handler方法

def jwt_response_payload_handler(token, user=None, response=None):   # 如果不知道為啥要帶這三個參數,可以ctrl+shift+f全局搜索,再jwt得post方法有
    """
    自定義jwt認證成功返回對象
    :param token: token
    :param user: 用戶對象
    :param request:
    :return: 用戶token,id,戶名username,用戶頭像
    """
    return {
        "id": user.id,
        "username": user.username,
        "avatar": user.avatar.url,
        "token": token,
        "nickname": user.nickname
    }

   修改配置文件dev.py,指定處理得方法:

JWT_AUTH = {
    ...
    "JWT_RESPONSE_PAYLOAD_HANDLER": "users.utils.jwt_response_payload_handler",
}

 

6、如下圖返回結果,即為改造成功                                                                  

 

 

 

7、改造authentication 實現多條件登錄                                                      

  django.auth提供得登錄,僅限於使用username 和password 進行認證登錄,如果想要使用多條件(例如:手機號+密碼; 郵箱+密碼)登錄,此時需要改寫authentication方法

  django.auth得認證可以查看:from django.contrib.auth.backends import ModelBackend得authentication方法

  在模塊(users)得utils文件中重新寫

from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q


def get_user_by_other_info(account):
    """
    根據不同的賬號類型來獲取用戶
    :param username:  用戶信息,可以是用戶名,也可以是郵箱或者手機號碼
    :return:
    """
    try:
        user = User.objects.get(Q(username=account) | Q(mobile=account) | Q(email=account))
    except User.DoesNotExist:
        user = None
    return user


class UserInfoModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        重寫authentication, 以支持多條件登錄
        :param request:
        :param username: 用戶名或者手機號碼或者用戶郵箱
        :param password:  登錄密碼
        :param kwargs:
        :return: 認證后的用戶對象
        """
        user = get_user_by_other_info(username)
        if isinstance(user, User) and user.check_password(password) and self.user_can_authenticate(user):
            return user

   修改配置文件,指定authenticate處理方法:

AUTHENTICATION_BACKENDS = [
    "users.utils.UserInfoModelBackend",
]

 

8、出現下圖,則多條件登錄,后端配置成功                                                                


免責聲明!

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



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