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浅拷贝与深拷贝用法实例
May 09 Python
python删除特定文件的方法
Jul 30 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
请假条的格式
2014/04/11 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
房屋过户委托书范本
2014/10/07 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
新学期开学标语2015
2015/07/16 职场文书