Django中应用jwt进行身份校验token

jwt 即 json web token。用于身份校验,当用户登录的时候,服务器会给用户分配一个token,服务不会保存。当用户需要访问服务器的时候,需要带着token,服务通过token来判断用户现在的状态,比如token失效不正确等。在小破站学习了一会大致了解了一点,这里记录一下。

实现方法这里不赘述。

导入包

pip install pyjwt

安装慢的话可以参考这篇博文----->传送门

配置

utils.py

自定义的工具文件,里面用于调用jwt包里面的函数来返回生成token

import jwt
import datetime
from django.conf import settings


def get_token(payload, timeout):
    salt = settings.SECRET_KEY
    headers = {
        "typ": "jwt_",
        "alg": "HS256",
    }
    payload["exp"] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)  # 设置到期时间
    token = jwt.encode(payload=payload, key=salt, headers=headers).decode("utf-8")
    return token

登录视图

class LoginViewSet(ModelViewSet):
    parser_classes = [MultiPartParser, JSONParser, FormParser]
    # authentication_classes = []
    """视图集"""
    queryset = models.User.objects.all()
    serializer_class = UserModelSerializer
    # 搜索
    search_fields = ('id')

    @action(methods=['post'], detail=False)
    @csrf_exempt
    def register(self, request, *args, **kwargs):
        print(request.body)
        username = request.data.get("username")
        pwd = request.data.get("password")
        print(username)
        print(pwd)
        obj = models.User.objects.filter(nickname=username, pwd=pwd).first()
        if not obj:
            return Response({"code": 1000, 'error': '用户名或密码错误'})
        payload = {
            "id": obj.id,
            "name": obj.nickname,
        }
        token = get_token(payload, 1) # 这里设置有效时间为1分钟
        return Response({"code": 1001, 'data': token})

auth.py

用于验证的类,类似于一个中间件,在访问需要登录过状态才能访问的视图会首先进行身份验证。

import jwt
from jwt import exceptions
from rest_framework.authentication import BaseAuthentication
from django.conf import settings
from rest_framework.exceptions import AuthenticationFailed


class JwtQueryParamsAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get("token")
        salt = settings.SECRET_KEY
        try:
            result = jwt.decode(token, salt, True)
        except exceptions.ExpiredSignatureError:
            msg = "token失效"
            raise AuthenticationFailed({"code": 1001, "msg": msg})
        except exceptions.DecodeError:
            msg = "token认证失败"
            raise AuthenticationFailed({"code": 1002, "msg": msg})

        except exceptions.InvalidTokenError:
            msg = "非法token"
            raise AuthenticationFailed({"code": 1003, "msg": msg})

        return (result, token)

比如Article视图需要登录才能访问,我们只需要引入上面的验证类即可

class ArticleViewSet(ModelViewSet):
    parser_classes = [MultiPartParser, JSONParser, FormParser]
    authentication_classes = [JwtQueryParamsAuthentication]
    """视图集"""
    queryset = models.Article.objects.all()
    serializer_class = ArticleModelSerializer
    # 搜索
    search_fields = ('id')

postman来获取token

在这里插入图片描述
前端保存token请参考这篇文章------>传送门

posted @ 2021-02-23 13:33  沃特艾文儿  阅读(35)  评论(0)    收藏  举报  来源