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实现合并字典的方法
Jul 07 Python
Python heapq使用详解及实例代码
Jan 25 Python
利用python求相邻数的方法示例
Aug 18 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
python 接口返回的json字符串实例
Mar 27 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
Python3中对json格式数据的分析处理
Jan 28 Python
python+opencv实现车道线检测
Feb 19 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获取当月最后一天函数分享
2015/02/02 PHP
php代码架构的八点注意事项
2016/01/25 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python实现最速下降法
2020/03/24 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
小班上学期评语
2014/05/05 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
经理岗位职责
2015/02/02 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书