第一步:安裝jwt
pip install djangorestframework-jwt
第二步:settings/dev的配置文件配置
REST_FRAMEWORK = { # 認證配置 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }
解釋:定義drf配置全局默認的認證方案
第三步:
JWT_AUTH = { # 重新定義jwt認證成功后返回的數據 'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler', 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), #定義token過期時間為一天 }
解釋:第一個參數,重新定義jwt認證成功后返回的數據(jwt默認只返回token,我們在users.utils 下定義該類認證成功后 增加返回字段信息)
def jwt_response_payload_handler(token, user=None, request=None): """ 自定義jwt認證成功返回數據 """ return { 'token': token, 'user_id': user.id, 'username': user.username }
第四步:因為jwt 只對用戶名進行認證,我們重寫認證方式,增加手機號認證,上代碼:
setting.py繼續配置:
#在配置文件中告知Django使用我們自定義的認證后端 AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthenticate', ]
user.utils下自定義類重寫認證方式:
from django.contrib.auth.backends import ModelBackend from .models import User from django.db.models import Q
class UsernameMobileAuthenticate(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = User.objects.get(Q(username=username)|Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None
第五步:登錄時post請求url設置:
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^login/$',obtain_jwt_token),
]
是不是很厲害,就這樣我們就可以完成登錄校驗
下面上個例子,注冊成功后后台生成token 並返回前端,用戶直接登錄即可
注冊時 創建用戶序列化器增加字段:
from rest_framework_jwt.settings import api_settings #導入該模塊
class CreateUserSerializer(serializers.ModelSerializer):
token = serializers.CharField(label='登錄狀態token', read_only=True) # 增加token字段 username = ...
password = ...
''''''
user = super(CreateUserSerializer,self).create(validated_data)
user.set_password(validated_data['password'])
user.save()
# 補充生成記錄登錄狀態的token
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
# 將token保存到user對象中,隨着返回值返回給前端
user.token = token
return user
注:以上代碼是獲取token 生成token
我們再來看看前端接收,
LocalStorage.token=response.data.token sessionStorage.token=response.data.token
#我們將后台返回的token 保存在本地或者session即可:
然后我們請求后台是請求體攜帶即可:

這樣當我們登錄成功后 ,我們后台 request,user 就可以輸出當前用戶是誰
這些都是jwt 為我們做的很多事情。
