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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
Flask框架web开发之零基础入门
Dec 10 Python
python实现的读取网页并分词功能示例
Oct 29 Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 Python
基于pytorch 预训练的词向量用法详解
Jan 06 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 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漏洞全解(详细介绍)
2012/11/13 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
基于wordpress的ajax写法详解
2018/01/02 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
Python并发:多线程与多进程的详解
2019/01/24 Python
详解python中__name__的意义以及作用
2019/08/07 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
Python3运算符常见用法分析
2020/02/14 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
工业设计专业推荐信
2013/10/29 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
婚前协议书
2014/04/15 职场文书
产品包装策划方案
2014/05/18 职场文书
活动总结新闻稿
2014/08/30 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
旷课检讨书范文
2014/10/30 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python