1.JWT
是单向且不可逆的所以安全性较高,可以解码,不占用服务器内存,扩展能力较强,解决传统的session方法出现的问题
2.djangorestframework-jwt使用
在django安装
pip install djangorestframework-jwt
2.1配置
在settings.py中进行配置
from datetime import timedelta
JWT_AUTH = {
"JWT_EXPIRATION_DELIA":timedelta(days=2),
}
2.2提供了登录方法
配置路由
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]
2.3自定义返回数据
因为视图只返回token,所以对自定义视图 在子应用下创建utils.py
def jwt_response_payload_handler(token,user,request,*args,**kwargs):
return {
"uid":user.id,
"username":user.username,
"token":token
}
在settings.py进行配置
JWT_AUTH = {
"JWT_EXPIRATION_DELIA":timedelta(days=2),
"JWT_RESPONSE_PAYLOAD_HANDLER": "user.utils.jwt_response_payload_handler"
}
2.4 增加登录功能
在登录时进行验证用户信息,所以自定义认证类 修改Django认证系统的认证后端需继承django.contrib.auth.backends.ModelBackend,重写authenticate方法
from django.contrib.auth.backends import ModelBackend
from .models import User
from django.contrib.auth.hashers import check_password
class MyAuthentication(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
user = User.objects.filter(username=username,is_active=True,is_staff=True).first()
if user and check_password(password, user.password):
return user
return None
2.5配置自定义认证类
AUTHENTICATION_BACKENDS = [
'user.utils.MyAuthentication',
]
|