django基于存储在前端的token用户认证解析


Posted in Python onAugust 06, 2019

一.前提

首先是这个代码基于前后端分离的API,我们用了django的framework模块,帮助我们快速的编写restful规则的接口

前端token原理:

把(token=加密后的字符串,key=name)在登入后发到客户端,以后客户端再发请求,会携带过来服务端截取(token=加密后的字符串,key=name),我们再利用解密方法,将token和key进行解码,然后进行比对,成功就是登入过的认证,失败就是没有登入过的

还有一种方式,把{name:maple,id:1} 用我自己知道的加密方式加密之后变成了:加密字符串,加密字符串|{name:maple,id:1} 当做token,发到客户端,以后客户端再发请求,会携带,加密字符串|{name:maple,id:1}过来,服务端截取{name:maple,id:1},再用我们的加密方式加密:加密字符串,拿到加密后的字符串进行比对,这种方式,只要写一个密码函数就可以了,无需写解密函数

二.token加密与解密

在django的app中定义个token模块

将有关token的函数都放在里面,后面要用到,都调用这个模块

django基于存储在前端的token用户认证解析

加密token函数:

import time
import base64
import hmac
def get_token(key, expire=3600):
  '''
  :param key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
  :param expire: int(最大有效时间,单位为s)
  :return: token
  '''
  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")

解密函数:

def out_token(key, token):
  '''
  :param key: 服务器给的固定key
  :param token: 前端传过来的token
  :return: true,false
  '''
  # token是前端传过来的token字符串
  try:
    token_str = base64.urlsafe_b64decode(token).decode('utf-8')
    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()
    if calc_sha1_tsstr != known_sha1_tsstr:
      # token certification failed
      return False
    # token certification success
    return True
  except Exception as e:
    print(e)

三.视图CBV

登入函数:

from rest_framework.response import Response
from rest_framework.views import APIView
from app01 import models
# get_token生成加密token,out_token解密token
from app01.token_module import get_token,out_token
class AuthLogin(APIView):
  def post(self,request):
    response={"status":100,"msg":None}
    name=request.data.get("name")
    pwd=request.data.get("pwd")
    print(name,pwd)
    user=models.User.objects.filter(username=name,password=pwd).first()
    if user:
      # token=get_random(name)
      # 将name进行加密,3600设定超时时间
      token=get_token(name,60)
      models.UserToken.objects.update_or_create(user=user,defaults={"token":token})
      response["msg"]="登入成功"
      response["token"]=token
      response["name"]=user.username
    else:
      response["msg"]="用户名或密码错误"
    return Response(response)

登入后访问函数:

from rest_framework.views import APIView
from app01 import models
from app01.serialize_module import BookSerialize
from app01.authentication_module import TokenAuth1,TokenAuth2
class Books(APIView):
  authentication_classes = [TokenAuth2]
  def get(self,request):
    response = {"status": 100, "msg": None}
    book_list=models.Book.objects.all()
    book_ser = BookSerialize(book_list, many=True)
    response["books"]=book_ser.data
    return Response(response)

路由:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^books/$', views.Books.as_view()),
  url(r'^login/$', views.AuthLogin.as_view()),
]

四.framework认证功能

django基于存储在前端的token用户认证解析

from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import NotAuthenticated
# get_token生成加密token,out_token解密token
from app01.token_module import get_token,out_token
# 存储在前端的token解密比对
class TokenAuth2(BaseAuthentication):
  def authenticate(self,request):
    token=request.GET.get("token")
    name=request.GET.get("name")
    token_obj=out_token(name,token)
    if token_obj:
      return
    else:
      raise NotAuthenticated("你没有登入")

五.利用postman软件在前端提交

登入POST请求:

django基于存储在前端的token用户认证解析

返回结果:

django基于存储在前端的token用户认证解析

访问get请求:

django基于存储在前端的token用户认证解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 Python
Python argv用法详解
Jan 08 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
用Python实现读写锁的示例代码
Nov 05 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
python如何保证输入键入数字的方法
Aug 23 Python
python实现查找所有程序的安装信息
Feb 18 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
Python经典五人分鱼实例讲解
Jan 04 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 Python
django基于cors解决跨域请求问题详解
Aug 06 #Python
django组合搜索实现过程详解(附代码)
Aug 06 #Python
使用Python自动生成HTML的方法示例
Aug 06 #Python
Django RBAC权限管理设计过程详解
Aug 06 #Python
python虚拟环境完美部署教程
Aug 06 #Python
python批量图片处理简单示例
Aug 06 #Python
Python实用库 PrettyTable 学习笔记
Aug 06 #Python
You might like
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
php计算税后工资的方法
2015/07/28 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
python模块导入的方法
2019/10/24 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Python简单实现区域生长方式
2020/01/16 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
善意的谎言事例
2014/02/15 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
我收到了德劲DE1107
2022/04/05 无线电
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python