Django restframework之Token验证的缺陷及jwt的简单使用
一.主要缺陷:
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/