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基础教程之popen函数操作其它程序的输入和输出示例
Feb 10 Python
python的keyword模块用法实例分析
Jun 30 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
pytorch 归一化与反归一化实例
Dec 31 Python
python属于解释语言吗
Jun 11 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
Python连接Impala实现步骤解析
Aug 04 Python
实例代码讲解Python 线程池
Aug 24 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
总结Python变量的相关知识
Jun 28 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
初识Javascript小结
2015/07/16 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python中format()函数的简单使用教程
2018/03/14 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Python实现不规则图形填充的思路
2020/02/02 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
工程总经理工作职责
2013/12/09 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
计划生育宣传标语
2014/06/21 职场文书
班级读书活动总结
2014/06/30 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
业务员管理制度范本
2015/08/06 职场文书
市场营销计划书
2019/04/24 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python