Django中的JWT身份验证的实现
1.认证与授权
1.验证:身份验证是验证个人或设备标识的过程。身份验证过程之一是登录过程。注册网站后,您的信息(id,密码,名称,电子邮件等)将存储在其数据库中。之后,您无需创建帐户即可提供信息。相反,您只需要提供用户名和密码来验证您的身份,网站就会自动知道您正在访问。
2.授权:授权是用于确定用户特权或访问级别的安全机制。在许多社区网站上,只有上传帖子和管理员的人才能删除它。当其他人尝试删除帖子时,网站应该抛出错误(但是在许多情况下,他们甚至看不到删除按钮)。因此,对于每个请求,用户都需要证明自己具有权限。
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.py secret_key = 'abcde1234', jwt_algorithm = 'hs256'
# user/views.py import json from datetime import datetime, timdelta from django.conf import settings from django.http import jsonresponse from django.views import view import bcrypt import jwt from .models import user from token_utils import user_token class 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.py import json from django.conf import settings from django.http import jsonresponse import jwt from user.models import user def 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身份验证的实现的文章就介绍到这了,更多相关django jwt身份验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 为什么说千万别来*民族大学?女生念*民族大学好就业吗?
下一篇: js实现axios限制请求队列
推荐阅读
-
在JavaScript中实现类的方式探讨_javascript技巧
-
Unity中 ShaderGraph 实现超级炫酷的溶解效果入门级教程
-
在C#中根据HardwareID获取驱动程序信息的实现代码
-
用php实现动态产生xml文件以及从xml文件中抽取数据转化成html的小程序_PHP教程
-
图片metirc中的PSNR,SSIM实现
-
php怎么实现在查询列表中,点击查询结果跳转查询对应记录的详细内容,如图所示
-
PHP实现Javascript中的escape及unescape函数代码分享,escapeunescape
-
今日分享一点干货。PHP中课程表的实现。
-
如何实现MySQL中的用户管理_MySQL
-
php中通过curl模拟登陆discuz论坛的实现代码 [壹]