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