使用django的jwt模块: 安装:pip install djangorestframework-jwt
配置:
将djangorestframework-jwt注册到apps中
INSTALLED_APPS = [
'rest_framework_jwt',#djano_jwt
]settings.py下配置
import datetime
JWT_AUTH = { 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_AUTH_HEADER_PREFIX': 'JWT', #前缀需要家jwt }
登录成功后生成token返回给前端:views.py
from rest_framework.viewsets import ViewSet
#获取token
def _get_token(user):
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
#传递用户对象,获取token
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
class UserView(ViewSet):
#datail=True的时候,查询字符串携带pk
@action(methods=['POST'],detail=False)
def login(self,request,*args,**kwargs):
username = request.data.get('username')
password = request.data.get('password')
user = models.User.objects.filter(username=username).first()
ret = user.check_password(password)
if ret:
token = _get_token(user)
return ApiResponse(msg='登录成功',code=100,data={'token':token,'username':username})
else:
return ApiResponse(msg='用户名或密码错误',code=101)前端携带token过来,进行认证,自己写认证:auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.serializers import jwt_decode_handler,jwt_get_username_from_payload
import jwt
class MyJWTAuthentication(BaseAuthentication):
def authenticate(self, request):
#前端是将token通过http请求头发送过来,且AUTHORIZATION:token
token = request.META.get('HTTP_AUTHORIZATION')
if token:
#jwt通过了通过三段tokken,取出payload的方法,并且有校验功能
try:
payload = jwt_decode_handler(token)
username = payload.get('username')
return (username,token)
except jwt.ExpiredSignature:
msg = 'token过期'
raise AuthenticationFailed(msg)
except jwt.DecodeError:
msg='toke非法'
raise AuthenticationFailed(msg)
except jwt.InvalidTokenError:
msg = '用户非法'
raise AuthenticationFailed(msg)
except Exception as e:
msg=str(e)
raise AuthenticationFailed(msg)
raise AuthenticationFailed('你没有携带认证信息,说明情况')写一个需要成功登录后才能访问的api:views.py
class UserShowView(APIView):
#局部配置
authentication_classes = [authen.MyJWTAuthentication]
# permission_classes = [IsAuthenticated]
def get(self,request):
token = request.auth
user = request.user
return ApiResponse(msg='token 认证成功',data={'token':token,'user':user})使用postman测试:
登录,获取token

拿到token后,复制,携带token访问需要认证的api

token = request.META.get('HTTP_AUTHORIZATION')这里就是在获取前端携带的token,系统默认给key加上 HTTP_再拼接上AUTHORIZATION,作为后端获取token的key
生成token和解析token要使用配对的模块:
1、使用rest_framework_jwt.serializers
生成token需要的两个函数 from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler payload = jwt_payload_handler(用户对象) token = jwt_encode_handler(payload) 这样就生成token
解析token需要的函数 from rest_framework_jwt.serializers import jwt_decode_handler payload = jwt_decode_handler(token) #对前端发送过来的token进行解析,得到payload,这里其实就是一个字典 验证成功 return user,token 这个必须return 元组,且该元组是可以被视图函数所获取到 1、通过request.user 获取到元组的第一个元素 2、通过request.auth 获取到元组的第二个元素
2、生成token的可以使用
生成token的两个函数 from rest_framework_jwt.utils import jwt_payload_handler,jwt_encode_handler 解析token的一个函数: from rest_framework_jwt.authentication import jwt_decode_handler 其他使用方法都一样。
认证模块全局和局部配置:
全局配置:在settings.py下
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
#这个是我们自己写的认证类所在的位置
'studentSystemt.apps.user.authen.MyJWTAuthentication'
],
}
局部配置:
在视图类中添加:
class Home():
authentication_classes = [authen.MyJWTAuthentication]