djangorestframework-jwt使用,生成token,token认证

2022-08-18 09:08:23

使用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]

  • 作者:东林牧之
  • 原文链接:https://blog.csdn.net/weixin_46371752/article/details/121749129
    更新时间:2022-08-18 09:08:23