Django基于Token的验证使用的实现

作者:ProgramNotes 时间:2023-06-14 18:43:54 

什么是Token

Token字面意思是令牌,功能跟Session类似,也是用于验证用户信息的,Token是服务端生成的一串字符串,当客户端发送登录请求时,服务器便会生成一个Token并将此Token返回给客户端,作为客户端进行请求的一个标识以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。与session的不同之处在于,Session是将用户信息存储在服务器中保持用户的请求状态,而Token在服务器端不需要存储用户的登录记录,客户端每次向服务端发送请求的时候都会带上服务端发给的Token,服务端收到请求后去验证客户端请求里面带着Token,如果验证成功,就向客户端返回请求的数据。

Django基于Token的验证使用的实现

为什么要用Token

1.Token无需存储降低服务器成本,session是将用户信息存储在服务器中的,当用户量增大时服务器的压力也会随着增大。

2.防御CSRF跨站伪造请求攻击,session是基于cookie进行用户识别的, cookie如果被截获,用户信息就容易泄露。

3.扩展性强,session需要存储无法共享,当搭建了多个服务器时其他服务器无法获取到session中的验证数据用户无法验证成功。而Token可以实现服务器间共享,这样不管哪里都可以访问到。

4.Token可以减轻服务器的压力,减少频繁的查询数据库。

5.支持跨域访问

6.适用于移动平台应用

Django基于Token的验证使用的实现

基于 Token 的身份验证流程

  •  客户端使用用户名跟密码请求登录

  • 服务端收到请求开始验证用户名与密码

  • 验证成功后,服务端生成一个 Token并把这个 Token 发送给客户端

  • 客户端收到 Token 以后可以把它存储起来,可以存放在 Cookie 里或者 Local Storage 里

  • 客户端再次向服务端请求资形式源的时候携带服务端生成的 Token发送给服务器

  • 服务端收到请求,然后去验证客户端请求里面携带的 Token,如果验证成功,就向客户端返回请求的数据,否则拒绝请求。

Django基于Token的验证使用的实现

Token的组成形式

JWT 标准的 Token 有三个部分:

header(头部)

每个 Token 里面都有一个 header,也就是头部数据,里面包含了使用的算法告诉我们这个token 是否加密。如果是未加密的 Token ,这个属性可以设置成 none。

payload(数据)

Payload 里面是 Token 要包含的一些数据,内容可以自行定义,也可以参考标准字段(简写:全称)iss:Issuer、sub:Subject、exp:Expiration time、iat:Issued at。

signature(签名)

将Header和Playload使用Base64编码生成一下再加入签名字符用加密算法加密一遍,得到唯一的签名,用来防止其他人来篡改Token中的信息。

Django基于Token的验证使用的实现

Django如何使用Token

即然我们知道Token的组成方式,那么我们就来创建下Token,首定义Header和Payload,header中定义token类型和加密方式,Payload定义具体内容,如何用户名,发行时间,过期时间等。


headers={'type':'JWT','alg':'HS256'}
payloads={'iss':user,'iat':time.time()}

分别加密headers和payloads,Django中内置了一个模块django.core.signing,可以用它来加密和解密任何数据,直接调用dumps和load函数来实现即可,将headers和payloads加密再用signing.dumps加密再用signing.b64_encode编码得到一串字符串,然后用MD5加密headers和payloads生成唯一的signature,最后把headers、payloads、signature组合成Token,下面是测试代码:

Django基于Token的验证使用的实现

接下来把Token带入到项目中来使用下,为了方便我们把加密封装成方法直接调用,这里我分别写了Encrypt、Decrypt、Token方法来加密解密和封装Token,最后把token带到数据中返回给前端,这里我用JsonResponse返回数据,data里面存放用户请求的数据,code返回请求的状态,token里面存放我们的token令牌。


HEADER={
   'type':'JWT',
   'alg':'HS256'
}

def Encrypt(value):
   data=signing.dumps(value)
   data=signing.b64_encode(data.encode()).decode()
   return data

def Decrypt(value):
   data=signing.b64_decode(value.encode()).decode()
   data=signing.loads(data)
   return data

def Token(headers,payloads):
   header=Encrypt(headers)
   payload=Encrypt(payloads)
   md5=hashlib.md5()
   md5.update(("%s.%s"%(header,payload)).encode())
   signature=md5.hexdigest()
   token="%s.%s.%s"%(header,payload,signature)
   return token

def login(request):
   user = request.POST.get('username').strip()
   pwd = request.POST.get('password').strip()
   print(request.method)
   # print(user,pwd)
   obj=models.Admin.objects.filter(name=user)
   if obj:
       print('456789')
       passwd=models.Admin.objects.filter(name=user).values('password')[0]['password']
       ret=check_password(pwd,passwd)
       userobj=models.Admin.objects.get(name=user)
       print('ret=',ret)
       if ret:
           headers=HEADER
           data={'phone': userobj.phone, 'mail': userobj.mail}
           payloads={'iss': userobj.name, 'iat':time.time()}
           token=Token(headers,payloads)
           print(token)
           info={'token':token}
           info['code']=200
           info['data']=data
           print(info)
           return JsonResponse(info)
       else:
           return  HttpResponse('400')
   else:
       return HttpResponse('400')

这时前端请求登录后可以接受到后台返回的info数据,里面包含了data、token和caode,这时我们可以把获取到的token存起来,一般存放在客户端的localstorage或者sessionStorage中,下次再次请求时把这个token再发给服务器,服务器验证成功后就会返回所需的数据了。

Django基于Token的验证使用的实现

来源:https://blog.csdn.net/kevinfan2011/article/details/90415875

标签:Django,Token,验证
0
投稿

猜你喜欢

  • Python下应用opencv 实现人脸检测功能

    2022-09-18 00:25:44
  • Oracle时间日期操作方法小结第1/2页

    2010-11-29 19:40:00
  • python实现多进程通信实例分析

    2023-04-08 19:44:05
  • Python实现GIF动图以及视频卡通化详解

    2022-06-28 03:27:34
  • mysql如何优化插入记录速度

    2024-01-29 07:44:35
  • Python脚本调试工具安装过程

    2021-08-02 23:10:53
  • Python转换itertools.chain对象为数组的方法

    2022-10-27 08:38:16
  • Python中getpass模块无回显输入源码解析

    2022-05-02 03:58:28
  • pandas按照列的值排序(某一列或者多列)

    2022-08-14 08:54:08
  • 基于javascript实现tab切换特效

    2024-02-24 12:31:58
  • Django开发RESTful API实现增删改查(入门级)

    2022-05-17 02:36:53
  • Python入门教程之运算符重载详解

    2021-10-12 20:15:28
  • 基于python3 的百度图片下载器的实现代码

    2021-07-15 00:22:34
  • 浅析vue中的nextTick

    2024-04-26 17:42:21
  • 清空所有表中的数据的存储过程

    2024-01-16 11:00:08
  • Python中时间datetime的处理与转换用法总结

    2022-05-03 01:23:01
  • 解析Go 中的 rune 类型

    2023-09-19 11:59:16
  • 聊聊Pytorch torch.cat与torch.stack的区别

    2021-05-07 02:07:39
  • Python使用pyautogui模块实现自动化鼠标和键盘操作示例

    2022-10-27 16:02:25
  • 使用Python脚本将Bing的每日图片作为桌面的教程

    2021-02-13 22:06:42
  • asp之家 网络编程 m.aspxhome.com