小白你还不会使用jwt吗?django实现jwt

本文详细介绍了如何在Django项目中配置JWT认证、创建和验证token,包括设置JWT_SECRET_KEY,使用JSONWebTokenAuthentication,以及前端登录时的token存储和后端对JWT的解析过程。
摘要由CSDN通过智能技术生成

 配置key和时间【在setting中添加】

token_key = secrets.token_hex(16)
JWT_SECRET_KEY = token_key
JWT_EXPIRATION_DELTA = datetime.timedelta(days=1)

设置【在setting中添加】

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        # 其他认证类...
    ),
}

创建一个构造函数

def create_jwt_token(username, password, role):
# payload 可以更改
    payload = {
        'password': password,
        'username': username,
        'role': role,
        'exp': datetime.utcnow() + settings.JWT_EXPIRATION_DELTA
    }
    return jwt.encode(payload, settings.JWT_SECRET_KEY, algorithm='HS256')

使用构造函数生成token

 token = create_jwt_token(username, password, role)
        res['token'] = token.decode('utf-8')

验证

前端在登录时候储存信息

 login() {

            axios.post("http://localhost:8000/api/login/", this.user).then(res => {

                if (res.data.code === 200) {

                    this.$message.success(res.data.msg)

                    localStorage.setItem('jwtToken', token);

                    setTimeout(() => {

                        location.href = "/"

                    }, 400)

                } else {



                    this.$message.error(res.data.msg)

                }



            })

调用储存的token

methods: {
    get_username() {
      // 获取存储在本地存储中的JWT令牌
      const token = localStorage.getItem('jwtToken');
      // 如果没有令牌,你可能需要进行一些处理,比如重定向到登录页面或者显示错误信息
      if (!token) {
        console.error("未找到JWT令牌");
        return;
      }
      // 将JWT令牌添加到请求标头中
      const headers = {
        'Authorization': `Bearer ${token}`
      };
      axios.get("http://localhost:8000/api/get_username/",
        { headers }
      ).then(res => {
        console.log(res);
        if (res.data.code[0] === 200) {
          this.username = res.data.username[0]
        } else {
          this.$message.error(res.data.msg)
        }
      })
    }
  },
  created() {
    this.get_username()
  }

后端解析jwt

import jwt
from django.conf import settings
from django.http import JsonResponse
from django.views import View

class IndexView(View):
    def get(self, request):
        res = {
            "msg": "获取token失败",
            "code": 425,
            "username": None,
            "role": None
        }
        token = request.headers.get('Authorization')
        # 解析token
        if not token:
            return JsonResponse(res)
        token = token.split(" ")[1]
        try:
            decoded_token = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=['HS256'])
            username = decoded_token['username']
            role = decoded_token['role']
        except jwt.ExpiredSignatureError:
            res["msg"] = "token已过期"
            return JsonResponse(res)
        except jwt.InvalidTokenError:
            res["msg"] = "token无效"
            return JsonResponse(res)
        res["code"] = 200,
        res["msg"] = "获取成功",
        res["username"] = username,
        res["role"] = role
        return JsonResponse(res)

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值