Django-rest_framework中利用jwt登陸驗證時,自定義返回憑證和登陸校驗支持手機號

安裝django

pip install djangorestframework-jwt

在Django.settings中配置函數

REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  # 添加jwt驗證類
 ), } JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  # 生成的token有效期
}

調用jwt登陸驗證視圖url

在對應的Django應用的urls中添加以下路徑spa

from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r'^authorizations/$', obtain_jwt_token),  # 路徑能夠按照本身需求指定
]

因爲jwt返回的信息中只包括憑證token,要想在返回的結果中添加用戶信息,須要經過以下配置rest

def jwt_response_payload_handler(token,user=None,request=None): """爲返回的結果添加用戶相關信息"""
    
    return { 'token':token, 'user_id':user.id, 'username':user.username }

同時在settings中添加配置code

JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  # token有效期
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',  # response中token的payload部分處理函數
}

因爲jwt的登陸驗證默認只支持使用username,爲了可以使用手機號驗證,可經過重寫Django驗證類django.contrib.auth.backends.ModelBackend中的authenticate方法:jwt

      authenticate(self, request, username=None, password=None, **kwargs) ;對象

參數說明blog

request:發起本次認證請求的對象token

username:發起本次認證請求的用戶名

password:發起本次認證請求的密碼

def get_user_by_account(account): """ 添加經過手機號查詢用戶的方法 """
    try: if re.match(r'^1[3,5,6,7,8,9]\d{9}$',account):  # account 是手機號
            user = User.objects.get(mobile=account) else: user = User.objects.get(username=account) except User.DoesNotExist: return None else: return user class UsernameMobileAuthBackend(ModelBackend): """添加支持手機號登陸"""
    def authenticate(self,request,username=None,password=None,**kwargs): user = get_user_by_account(username)  # username 多是用戶名也多是手機號
        return user

在Django配置中添加認證配置

AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthBackend', ]
相關文章
相關標籤/搜索