一.主要缺陷:
1.Token驗證是放在一張表中,即authtoken_token中,key沒有失效時間,永久有效,一旦泄露,后果不可想象,安全性極差。
2.不利於分布式部署或多個系統使用一套驗證,authtoken_token是放在某台服務器上的,如果分布式部署,將失效,或多個系統用一套驗證,將必須復制該表到相應服務器上,麻煩費力。
詳情參照:http://lion1ou.win/2017/01/18/
二.jwt的使用:
1.安裝:
1.1pip install djangorestframework-jwt;
1.2在githup上找源碼安裝
2.配置:
2.1在你的settings.py
,添加JSONWebTokenAuthentication
到Django REST框架DEFAULT_AUTHENTICATION_CLASSES
。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }
2.2在您urls.py
添加以下URL路由以啟用通過POST獲取令牌包括用戶的用戶名和密碼。
from rest_framework_jwt.views import obtain_jwt_token #... urlpatterns = [ '', # ... url(r'^api-token-auth/', obtain_jwt_token), ]
2.3jwt相關使用(setting.py中配置):
import datetime JWT_AUTH={ #Token失效時間 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), #Token前綴 'JWT_AUTH_HEADER_PREFIX': 'JWT' }
2.4自定義用戶驗證(obtain_jwt_token默認為使用用戶名和密碼):
#views中重寫authenticate認證
from django.contrib.auth.backends import ModelBackend
User=get_user_model() # Create your views here. class CustomBackend(ModelBackend): ''' 自定義用戶驗證(setting.py) ''' def authenticate(self, username=None, password=None, **kwargs): try: user=UserProfile.objects.get(Q(username=username)|Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None
#setting中添加BANCENDS AUTHENTICATION_BACKENDS=( #將bancends添加進setting 'users.views.CustomBackend', )
詳情參照: http://getblimp.github.io/django-rest-framework-jwt/