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的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
详解Python爬虫的基本写法
Jan 08 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
如何用python整理附件
May 13 Python
python使用response.read()接收json数据的实例
Dec 19 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
python 浮点数四舍五入需要注意的地方
Aug 18 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
Flask框架各种常见装饰器示例
2018/07/17 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
Python龙贝格法求积分实例
2020/02/29 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
总经理助理的八要求
2013/11/12 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
安全责任书范本
2014/04/15 职场文书
跳蚤市场口号
2014/06/13 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
调解协议书范本
2016/03/21 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL