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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
在python中修改.properties文件的操作
Apr 08 Python
在python image 中实现安装中文字体
May 16 Python
django使用channels实现通信的示例
Oct 19 Python
python 实现图片裁剪小工具
Feb 02 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
树结构之JavaScript
2017/01/24 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
python批量同步web服务器代码核心程序
2014/09/01 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
境外导游求职信
2014/02/27 职场文书
建议书怎么写
2014/03/12 职场文书
贪污检举信范文
2015/03/02 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
SQL注入的实现以及防范示例详解
2021/06/02 MySQL