Django中的JWT身份验证的实现
作者:林-金鹏 发布时间:2022-10-28 23:01:54
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
来源:https://blog.csdn.net/weixin_46105038/article/details/116431469


猜你喜欢
- 爆库语句,修改红色部分的数字挨个猜出库 /**/and/**/(select/**/top/**/1/**/isnull(cast([nam
- 最近,我有机会研究对视觉设计作用的常见误解,这些误解仍然盛行于行政主管、产品主管,工程经理和市场专家中。设计团队成员如何说明这些认识是错误的
- 目录优化排序查询避免重复获取刚刚修改的数据行懒加载的联合查询优化排序查询自定义变量的一个重要特性是你可以同时将该变量的数学计算后的结果再赋值
- 本文实例讲述了python集合用法。分享给大家供大家参考。具体分析如下:# sets are unordered collections o
- 一直觉得wxpython占用内存比较多,在工作中写的一些小程序应用,一对比其它的小程序,发现内存相差确实有点大。测试了下QT框架import
- 本文实例讲述了Python企业编码生成系统总体系统设计。分享给大家供大家参考,具体如下:一 系统功能结构二 系统主界面三
- 本文以sql2012为例第一步,(查询日志中文件名和大小):USE 数据库名GOSELECT file_id, name,size,* FR
- 音乐流媒体服务的兴起使得音乐无处不在。我们在上下班的时候听音乐,锻炼身体,工作或者只是放松一下。这些服务的一个关键特性是播放列表,通常按流派
- Python PyTorch深度学习框架PyTorch是一个基于Python的深度学习框架,它支持使用CPU和GPU进行高效的神经网络训练。
- router 动态路由清除重置matcher可达到路由还原效果在用户退出时调用 resetRouter(router) 即可还原路由impo
- 目录瞎比比与 print 相比 logging 有什么优势?基础用法保存到文件多模块使用 logging使用配置文件配置 logging瞎比
- 现在浏览器种类也越来越多,诸如 IE、Firefox、Chrome、Safari等等,因此现在要实现一个js复制内容到剪贴板的小功能就不是一
- python3与python2的还是有诸多的不同,比如说在2中:print "Hello,World!" r
- 使用tensorflow训练模型的时候,模型持久化对我们来说非常重要。如果我们的模型比较复杂,需要的数据比较多,那么在模型的训练时间会耗时很
- 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。该方法的基本思想是:1.先从数列中取出一个数作为基准数
- 通过XML使系统之间的数据交换变得更简单,因为它与编程语言无关,刚引入XML的概念时,是通过一个脚本或应用程序解析XML数据,将其转换为适合
- 第一次写博客,实属心血来潮。为什么要写这篇博客呢?原因如下1、有一次我想配置数据库端口号时,找不到对应的解决方案2、是时候有个地方可以记录一
- 介绍 append()语法list.append( element )参数element:任何类型的元素列表「末尾」添加元素nam
- expect脚本expect是什么expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用
- 图表库下面的类库可以让你很简单就能创建复杂的图表和图片。当然,它们需要GD库的支持。pChart - 一个可以创建统计图的库。Libchar