在Django中使用PyJWT实现登录及验证功能

目录

1、安装PyJWT

2、对信息加密及解密

3、配置登录视图和及url

4、登录装饰器

5、在验证有登录权限的的视图中登录


PyJWT的使用

1、安装PyJWT

复制代码
pip isntall pyjwt

2、对信息加密及解密

python 复制代码
import jwt
import datetime
from jwt import exceptions

# 加密盐
JWT_SALT = "ds()udsjo@jlsdosjf)wjd_#(#)$"


def create_token(payload, timeout=20):
    # 声明类型,声明加密算法
    headers = {
        "type": "jwt",
        "alg": "HS256"
    }
    # 设置过期时间
    payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=36000)
    result = jwt.encode(payload=payload, key=JWT_SALT, algorithm="HS256", headers=headers).decode("utf-8")
    # 返回加密结果
    return result


def parse_payload(token):
    """
    用于解密
    :param token:
    :return:
    """
    result = {"status": False, "data": None, "error": None}
    try:
        # 进行解密
        verified_payload = jwt.decode(token, JWT_SALT, True)
        result["status"] = True
        result['data'] = verified_payload
    except exceptions.ExpiredSignatureError:
        result['error'] = 'token已失效'
    except jwt.DecodeError:
        result['error'] = 'token认证失败'
    except jwt.InvalidTokenError:
        result['error'] = '非法的token'
    return result

3、配置登录视图和及url

python 复制代码
class LoginView(View):
    """登录"""
    def post(self, request):
        data_dict = json.loads(request.body.decode())
        username = data_dict.get('username', None)
        password = data_dict.get('password', None)

        user = authenticate(request, username=username, password=password)  # 用户名密码认证
        if user is not None:
            token = create_token({"username": username})  # jwt加密生成token
            return JsonResponse({"status": 200, "token": token})
        else:
            return JsonResponse({"status": 400, "error": "用户名密码错误"})

在登录成功后会返回一个token

4、登录装饰器

用于验证用户是否登录成功

python 复制代码
def decorator_login_require(func):
    """登录装饰器"""
    def wrapper(request, *args, **kwargs):
        authorization = request.META.get('HTTP_AUTHORIZATION', '')  # 获取Headers里的Authorization值
        if authorization:
            payload = parse_payload(authorization)  # 解密token
            status = payload['status']
            if status:
                username = payload['data']['username']
                user = UserProfile.objects.filter(username=username).first()  # 解密后查询
                if user:
                    request.user = user
                    return func(request, *args, **kwargs)
            else:
                return JsonResponse({"status": 401, "msg": payload['error']})
        return JsonResponse({"status": 401, "msg": "对不起,您还未登录"})
    return wrapper

5、在验证有登录权限的的视图中登录

将decorator_login_require装饰器装饰在类视图的post方法上

python 复制代码
class OnlyLoginCanView(View)
    """只有登录的用户才能访问的视图"""

    @method_decorator(decorator_login_require)
    def post(self, request):
        # 具体的功能逻辑
        return JsonResponse({"status": 200, "msg": "成功"})

配置OnlyLoginCanView类视图的url后在请求时在Headers里需要添加参数名为Authorization 值为登录时返回的token值登录,否则不能访问该视图

成功时

当传入的Authorization 值不是登录时返回的token值时不能成功登录

相关推荐
财经资讯数据_灵砚智能7 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月29日
人工智能·python·信息可视化·自然语言处理·ai编程
触底反弹9 分钟前
从数据结构到 Prompt 设计:前端工程师的 AI 时代进阶指南
javascript·人工智能·python
好好风格11 分钟前
这个开源项目,把本地大模型做成会说话的 Live2D 桌宠
人工智能·python·开源
Ada's29 分钟前
【计算机基础系列】python语言:环境搭建
开发语言·python
m沐沐38 分钟前
【机器学习】信用卡欺诈检测实战:逻辑回归 + 下采样
人工智能·python·机器学习·pycharm·逻辑回归·numpy
好好学仿真43 分钟前
机器学习预测聚合物拉伸强度:五种回归算法对比(附Kaggle数据集 + 五折交叉验证)
python·机器学习·xgboost·梯度提升·材料性能预测·随机森林回归
宸津-代码粉碎机1 小时前
Spring AI 企业级RAG实战|增量更新+文档去重+定时自动入库生产落地方案
java·大数据·人工智能·后端·python·spring
正在走向自律1 小时前
告别低效繁琐!DeepSeek+Python 重塑科研绘图新范式
python·开发工具·deepseek·ai辅助编程
曾阿伦1 小时前
Unicode 正则表达式开发指南
python·正则表达式
香辣西红柿炒蛋1 小时前
yaml文件介绍、数据读取
python