当前位置:   article > 正文

【Python】Django 中 PyJWT 认证流程_python django jwt

python django jwt

JWT 介绍

​JWT( Json Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明。目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目。

​JWT认证流程

​在项目开发中,一般会按照给定流程进行认证,即:用户登录成功之后,服务端给用户浏览器返回一个 token,以后用户浏览器要携带 token 再去向服务端发送请求,服务端校验 token 的合法性,合法则给用户看数据,否则,返回一些错误信息。 

​传统Token方式和JWT在认证方面有什么差异?

传统 token 方式

用户登录成功后,服务端生成一个随机 token 给用户,并且在服务端(数据库或缓存)中保存一份 token,以后用户再来访问时需携带 token,服务端接收到 token 之后,去数据库或缓存中进行校验 token 的是否超时、是否合法。

jwt 方式

用户登录成功后,服务端通过 jwt 生成一个随机 token 给用户(服务端无需保留 token),以后用户再来访问时需携带token,服务端接收到 token 之后,通过 jwt 对 token 进行校验是否超时、是否合法。 

安装 

pip install PyJWT

eg

1.model.py -- 生成数据模型 

  1. from datetime import datetime
  2. from msilib.schema import tables
  3. from django.db import models
  4. # Create your models here.
  5. ##### 管理后台用户表数据
  6. class AdminUsers(models.Model):
  7. class Meta:
  8. db_table="crm_admin_users"
  9. username=models.CharField("用户名",max_length=30,unique=True)
  10. password=models.CharField("密码",max_length=32)
  11. profile_picture=models.CharField("头像",max_length=200,default="",null=True)
  12. mg_status = models.BooleanField("状态",choices=((0,'关闭'),(1,'启用')),default=1)
  13. email = models.EmailField("邮箱地址",null=True,default="")
  14. token = models.CharField("token值",max_length=150,default="",null=True,unique=True)
  15. expired_at = models.IntegerField("过期时间")
  16. roles = models.ManyToManyField("Roles")### 用户和角色多对多
  17. depart=models.ManyToManyField("Department") ### 用户和部门多对多关系
  18. created_at = models.DateTimeField('创建时间',default=datetime.now,null=True)
  19. updated_at = models.DateTimeField("更新时间",default=datetime.now,null=True)
  20. #### 部门表的内容
  21. class Department(models.Model):
  22. class Meta:
  23. db_table="crm_department"
  24. pid=models.IntegerField("部门父id")
  25. name=models.CharField("部门名称",max_length=50,default="",null=True)
  26. status = models.BooleanField("状态",choices=((0,'停用'),(1,'启用')),default=1)
  27. order=models.IntegerField("排序")
  28. created_at = models.DateTimeField('创建时间',default=datetime.now,null=True)
  29. updated_at = models.DateTimeField("更新时间",default=datetime.now,null=True)
  30. ####角色列表
  31. class Roles(models.Model):
  32. class Meta:
  33. db_table="crm_roles"
  34. role_name=models.CharField("角色名称",max_length=20,default="")
  35. role_desc = models.CharField("角色描述",max_length=50,default="")
  36. created_at = models.DateTimeField('创建时间',default=datetime.now,null=True)
  37. updated_at = models.DateTimeField("更新时间",default=datetime.now,null=True)
  38. ##### 权限表
  39. class Permissions(models.Model):
  40. class Meta:
  41. db_table="crm_permissions"
  42. pid = models.IntegerField("父级id",default=0)
  43. name = models.CharField("权限名称",max_length=20,default="")
  44. path = models.CharField("路由地址",max_length=40,default="")
  45. is_menu = models.SmallIntegerField("是否菜单",choices=((1,"是"),(2,"否")),default=1)
  46. icon = models.CharField("菜单图标",max_length=30,default="",null=True)
  47. sort = models.IntegerField("排序",default=10)
  48. access=models.CharField("权限标识",max_length=50,default="",null=True)
  49. roles=models.ManyToManyField("roles") ### 角色和权限多对多的关系
  50. created_at = models.DateTimeField('创建时间',default=datetime.now,null=True)
  51. updated_at = models.DateTimeField("更新时间",default=datetime.now,null=True)

2. 在 view.py  -- 文件中生成token。 

  1. import jwt
  2. import time
  3. # 生成 token: jwt.encode(playload, key, algorithm='HS256')
  4. # playload : 配置参数; key为app的SECRET_KEY(密钥); algorithm 为加密算法
  5. info = {
  6. 'exp': time.time() + 30000, # jwt的过期时间,这个过期时间必须要大于签发时间
  7. 'iat': time.time(), # jwt的签发时间
  8. 'iss': 'IsSuer', # jwt签发者
  9. 'data': {
  10. 'username': "shijieheping",
  11. 'timestamp': time.time()
  12. }
  13. }
  14. jwt_encode = jwt.encode(info, "secret", algorithm="HS256")
  15. # 解密,校验签名
  16. s = jwt.decode(s, 'secret', issuer='lianzong', algorithms=['IsSuer'])
3.新建electronicAdmin/middleware.py文件 (settings.py 同级目录); 将 token 进行认证。
  1. #### 自定义中间件的请求
  2. import time
  3. from django.utils.deprecation import MiddlewareMixin;#### 导入包文件
  4. from django.http import JsonResponse;
  5. from .models import *
  6. # 定义中间件的类方法
  7. class Authorization(MiddlewareMixin):
  8. # 前置拦截器,请求前触发的方法
  9. def process_request(self,request):
  10. print("中间件触发")
  11. try:
  12. # 判断请求的如果不是登录的Api接口,判断token的内容
  13. if ('login' not in request.path):
  14. # 获取token值
  15. token = request.META.get("HTTP_AUTHORIZATION")
  16. # 没有传递token值
  17. if not token:
  18. return JsonResponse({
  19. 'code':401,
  20. 'msg':'token无效'
  21. })
  22. # 通过token值获取用户的信息,判断token是否合理
  23. user = AdminUsers.objects.filter(token=token).first()
  24. print(user)
  25. # 没有token值
  26. if not user:
  27. return JsonResponse({
  28. 'code':401,
  29. 'msg':'token不存在'
  30. })
  31. # 判断用户的时间是否过期
  32. if user.expired_at < time.time():
  33. return JsonResponse({
  34. 'code':401,
  35. 'msg':'token已经过期'
  36. })
  37. except Exception:
  38. return JsonResponse({
  39. 'code':401,
  40. 'msg':'token无效'
  41. })

settings.py  注册中间件

  1. MIDDLEWARE = [
  2. 'electronicAdmin.middleware.MD1'
  3. ]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/893648
推荐阅读
相关标签
  

闽ICP备14008679号