文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django中如何实现JWT身份验证

2023-06-14 23:35

关注

这篇文章主要介绍Django中如何实现JWT身份验证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1.认证与授权

验证:身份验证是验证个人或设备标识的过程。身份验证过程之一是登录过程。注册网站后,您的信息(ID,密码,名称,电子邮件等)将存储在其数据库中。之后,您无需创建帐户即可提供信息。相反,您只需要提供用户名和密码来验证您的身份,网站就会自动知道您正在访问。

授权:授权是用于确定用户特权或访问级别的安全机制。在许多社区网站上,只有上传帖子和管理员的人才能删除它。当其他人尝试删除帖子时,网站应该抛出错误(但是在许多情况下,他们甚至看不到删除按钮)。因此,对于每个请求,用户都需要证明自己具有权限。

2.什么是JWT

JSON Web令牌(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象进行传输。您可以使用JWT对请求进行身份验证和授权。

JWT由三个串联的Base64url编码的字符串(标头,有效负载和签名)组成,并用点号(,)分隔。标头包含有关令牌和加密算法类型的元数据。签名用于验证令牌的可信度。有效负载包含用于身份验证和授权的所有必要数据。

3.存储JWT

当用户登录时,服务器将创建JWT并将其发送到客户端。然后,客户端将其存储到会话存储或本地存储。每次客户端向服务器端发送需要身份验证或授权的请求时,都会在授权标头上发送JWT。易受XSS(跨站点脚本)攻击:会话和本地存储可通过JavaScript访问。恶意第三方可以将其JS注入网站,从而可以向API发出请求。

服务器将JWT存储在Cookie中,并使用存储在Cookie中的JWT验证用户。Cookies容易受到CSRF的攻击,因为它们随每个请求一起发送。因此,恶意的第三方可以轻松地提出意想不到的请求。

4.Django中的JWT

# settings.pySECRET_KEY = 'abcde1234',JWT_ALGORITHM = 'HS256'
# user/views.pyimport jsonfrom datetime import datetime, timdeltafrom django.conf import settingsfrom django.http import JsonResponsefrom django.views import Viewimport bcryptimport jwtfrom .models import Userfrom token_utils import user_tokenclass UserSignInView(View):    def post(self, request):        try:            data = json.loads(request.body)            username = data['username']            pw_input = data['password']            user = User.objects.filter(username=username).first()            if user is None:                return JsonResponse({"message": "INVALID_USERNAME"}, status=401)            if bcrypt.checkpw(pw_input.encode('utf-8'),                              user.password.encode('utf-8')):                key = settings.SECRET_KEY                algorithm = settings.JWT_ALGORITHM                token = jwt.encode(                    {                        'iss': 'me',                        'id': user.id,                        'exp': datetime.utcnow() + timedelta(days=14)                    }, key, algorithm=algorithm).decode('utf-8')                response = JsonResponse(                    {                        'message': 'SUCCESS'                    }, status=200                )                # 当使用本地/会话存储而不是Cookie时,只需在JsonResponse中发送令牌                if data.get('remember_me') is not None:                    max_age = 14*24*60*60 # 14 days                    expires = datetime.strftime(                        datetime.utcnow() + timedelta(seconds=max_age),                        "%Y-%m-%d %H:%M:%S"                    )                    response.set_cookie(                        'token',                        token,                        max_age=max_age,                        expires=expires,                        httponly=True                    )                    return response            return JsonResponse({"message": "WRONG_PASSWORD"}, status=401)        except KeyError as e:            return JsonResponse({'message': f'KEY_ERROR: {e}'}, status=400)        except ValueError as e:            return JsonResponse({'message': f'VALUE_ERROR: {e}'}, status=400)
# token_utils.pyimport jsonfrom django.conf import settingsfrom django.http import JsonResponseimport jwtfrom user.models import Userdef user_token(func):    def wrapper(self, request, *args, **kwargs):        try:            token = request.COOKIES.get('token')            # token = request.headers.get('token')            key = settings.SECRET_KEY            algorithm = settings.JWT_ALGORITHM            if token is None:                return JsonResponse({"message": "INVALID_TOKEN"}, status=401)            decode = jwt.decode(token, key, algorithm=algorithm)            request.user = User.objects.get(id=decode['id'])        except jwt.ExpiredSignatureError:            return JsonResponse({"message": "EXPIRED_TOKEN"}, status=400)        return func(self, request, *args, **kwargs)    return wrapper

以上是“Django中如何实现JWT身份验证”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯