对当前用户,使用base64加密token,再解密token,但是不如JWT加密安全

import time
import base64
import hmac def generate_token(key, expire=3600):
r'''
@Args:
key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
expire: int(最大有效时间,单位为s)
@Return:
state: str
'''
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode("utf-8")
sha1_tshexstr = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest()
token = ts_str+':'+sha1_tshexstr
b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
return b64_token.decode("utf-8") # 解密,验证token def certify_token(key, token): token_str = base64.urlsafe_b64decode(token).decode('utf-8')
# print(token_str)
token_list = token_str.split(':')
if len(token_list) != 2:
return False
ts_str = token_list[0]
if float(ts_str) < time.time():
# token expired
return False
known_sha1_tsstr = token_list[1] sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1')
calc_sha1_tsstr = sha1.hexdigest()
print(token_list)
print(calc_sha1_tsstr)
print(known_sha1_tsstr)
if calc_sha1_tsstr != known_sha1_tsstr:
# token certification failed
return False
# token certification success
return True # 一小时后过期
#将key设置为username
token = generate_token('dujufei', 3600) #使用当前用户名去认证token,看当前登录用户是否合法。合法,返回True
status=certify_token('dujufei', token) print(token)
#MTU1NjEzMDAxMy4wNDMwNjg2OjFkYjg2NzE4YjIxZGIwNjAwMmVjYTQyNjRhZmRiY2JmYTNjMzZiNzU=
print(status)
#True

使用token进行当前用户状态保存,传给前端token

# token_test.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import render,redirect,HttpResponse
from rbac.models import UserInfo,UserToken import time
import hashlib def get_token(user):
# 获取一个字符串类型的时间戳时间
str_ctime = str(time.time())
# 生成一个加盐的hashlib对象
md5 = hashlib.md5(bytes(user,encoding='utf-8'))
# 给随机生成的字符串加密
md5.update(bytes(str_ctime,encoding='utf-8'))
# 返回加密后的字节型数据
return md5.hexdigest() class LoginView(APIView):
'''登录视图是校验逻辑接口,不需要用视图类组件'''
def post(self,request):
resp = {'code': 100}
try:
# 获取前端通过POST请求发送过来的数据 user = request.data.get('username')
pwd = request.data.get('password')
# 查找数据库中是否有此用户
user_obj = UserInfo.objects.filter(name=user,password=pwd).first()
if user_obj:
# 如果数据库中有此用户,就做以下内容:
# 1.将此用户名返回给前端
resp['user'] = user
# 2.将随机生成一个字符串作为Token值返回给前端
token = get_token(user)
resp['user_token'] = token
# 将随机生成的token保存在数据库中
UserToken.objects.update_or_create(user=user_obj,defaults={'usertoken':token}) else:
resp['code'] = 1001
resp['error'] = '用户名或者密码错误'
except Exception as e:
resp['code'] = 1002
resp['error'] = str(e)
return Response(resp)
# models.py
class UserInfo(models.Model):
"""
用户表
"""
name = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=64)
email = models.CharField(verbose_name='邮箱', max_length=32)
roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True) def __str__(self):
return self.name class UserToken(models.Model):
'''
token认证表
'''
usertoken=models.CharField(verbose_name='令牌',max_length=128)
user=models.OneToOneField(to='UserInfo',on_delete=models.CASCADE) def __str__(self):
return self.user.name

效果:

发送:对当前url    http://192.168.174.1:8022/login_test/ 点击post请求发送一下数据

{
  "username": "杜志浩",
  "password": 123
} 返回:前端得到以下信息: {
  "code": 100,
  "user": "杜志浩",
  "user_token": "443497bf67071775d8db8180af6eb848"
}

使用token做认证的更多相关文章

  1. 使用 AngularJS & NodeJS 实现基于token 的认证应用(转)

    认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构 ...

  2. 使用 AngularJS & NodeJS 实现基于 token 的认证应用

      认证是任何Web应用中不可或缺的一部分.在这个教程中,我们会讨论基于token的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构建的 ...

  3. JWT(Json web token)认证详解

    JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...

  4. 记一次token安全认证的实践

    阅读此文前请先阅读上一篇SpringBoot整合JWT实现用户认证了解JWT. 背景介绍: 因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用 ...

  5. 理解JWT(JSON Web Token)认证

    理解JWT(JSON Web Token)认证 最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式 ...

  6. day78:luffy:前端对于token的认证&滑动验证码的实现

    目录 1.前端对于token的认证 2.滑动验证码 1.滑动验证码实现的原理 2.滑动验证码的代码实现 1.配置文件 2.前端实现:Login.vue 3.后端实现:改写jwt代码 1.前端对于tok ...

  7. ASP.NET WebApi 基于OAuth2.0实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...

  8. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...

  9. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

随机推荐

  1. Java逆向工程SpringBoot + Mybatis Generator + MySQL

    Java逆向工程SpringBoot+ Mybatis Generator + MySQL Meven pop.xml文件添加引用: <dependency> <groupId> ...

  2. MT【324】增量代换

    实数$a,b,c$满足$a^2+b^2+c^2=1$求$f=\min\{(a-b)^2,(b-c)^2,(c-a)^2\}$的最大值 分析:由对称性不妨设$c\ge b\ge a$,令$b-a=s,c ...

  3. youtube上一些随手就来的牛逼颜色

    网页背景色: 白色背景 #f6f5f7:替代了原来的纯白,不那么刺眼,很和谐 黑色背景 #262626:一种很好看的黑色背景 其他颜色: 圆形边框线:#ddd;

  4. 并查集(我根本不会切板子啊喂QWQ长文)(大雾

    说句实话,我和并查集的缘分还是蛮深的,因为当年学完数论想着找板子题乱做(真是个神奇的找题方式呢),然后就看到了并查集QWQ,看了一会发现是图论就不看了,,,,,,结果还被说是大佬QWQ其实我只是个Na ...

  5. Idea查看并过滤某个接口或者类的实现

    查看当前类的父类 会出现一个图 不过这个有点鸡肋,我们通常想看一个类的实现有哪些,虽然有个方法可以,但是没有图. 查看类的实现 在你想查看的类上 Ctrl+H(Ctrl+Alt+B是直接弹窗,不能过滤 ...

  6. C# Linq to Entity 多条件 OR查询

    技术背景:框架MVC,linq to Entity 需要一定的lambda书写能力 问题:在简单的orm中完成一些简单的增删查改是通过where insert delete update 完成的,但是 ...

  7. python模拟蒙特·卡罗法计算圆周率

    蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题. 假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x, ...

  8. 《Exception团队》第一次作业:团队亮相

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 深入了解软件思想,强化编程技术 二.正文 1. ...

  9. express起一个代理服务器,webpack-dev-server同时起多个

    由于系统业务比较复杂,微前端(多页应用)实现期望用一个app一个webpack的形式,这样可以更好隔离,而且每个app的webpack config可以定制. Nginx在前端项目中安装比较麻烦,所以 ...

  10. woe_iv原理和python代码建模

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...