Django中的登入認證
Django中已經封裝好了後端的認證功能authenticate
1:Django REST framework JWT提供了登入簽發JWT的檢視,可以直接使用
驗證使用者名稱和密碼,驗證成功後,為使用者簽發JWT,前端將簽發的JWT儲存下來。
登入流程為:
查詢使用者資料,將查詢到的資料和使用者輸入的資料對比驗證
request.user===>當前登入的使用者
僅使用下面的程式碼即可實現登入和簽發token
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r'^authorizations/$', obtain_jwt_token), ]
但是此檢視函式所返回的只有一個token值,當需要獲取到其他值,如user.id,username等值時,需要重寫jwt_response_payload_handler函式
2:新建一個py檔案重寫自定義返回值的函式
def jwt_response_payload_handler(token, user=None, request=None): """ 自定義jwt認證成功返回資料 """ return { 'token': token, 'user_id': user.id, 'username': user.username }
然後修改專案的配置檔案
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
便可實現登入功能,此時可以返回給客戶端token值和id,顯示使用者名稱資訊
3:實現使用不同的註冊資訊進行登入,如使用手機號、郵箱 + 密碼登入。
主要的邏輯是接收到使用者輸入的登入資訊,使用正則表示式來判斷使用者是使用的那種註冊資訊登入的,然後根據註冊資訊查詢到使用者物件,返回使用者資訊,實現多種號碼都可登入的功能
檢視jwt檢視的原始碼發現,查詢驗證的工作是由authenticate()方法完成,這個方法是由django提供的。
修改Django認證系統的認證後端需要繼承django.contrib.auth.backends.ModelBackend,並重寫authenticate方法。
authenticate(self, request, username=None, password=None, **kwargs)方法的引數說明:
- request 本次認證的請求物件
- username 本次認證提供的使用者賬號
- password 本次認證提供的密碼
重寫authenticate方法,補充它的驗證功能,使其不僅僅可以使用使用者名稱登入
from django.contrib.auth.backends import ModelBackend
class MyAuthenticationBackends(ModelBackend):
"""根據username查詢 user物件, 在使用user物件的check_password對比密碼是否正確"""
def authenticate(self, request, username=None, password=None, **kwargs):
if re.match(r'^1[3-9]\d{9}$', username):
user = User.objects.get(mobile=username)
else:
user = User.objects.get(username=username)
if user.check_password(password):
return user
else:
return None
再在配置檔案中告知django我們自定義的認證
AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]
總結思路:
1.定義類
2.重寫authenticate方法
3.配置AUTHENTICATION_BACKENDS=[類]