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、出現下圖,則多條件登錄,后端配置成功