django基于存储在前端的token用户认证解析
作者:Maple_feng 发布时间:2023-12-27 19:14:59
标签:django,前端,token,用户,认证
目录
一.前提
二.token加密与解密
三.视图CBV
四.framework认证功能
五.利用postman软件在前端提交
一.前提
首先是这个代码基于前后端分离的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的函数都放在里面,后面要用到,都调用这个模块
加密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认证功能
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请求:
返回结果:
访问get请求:
来源:https://www.cnblogs.com/angelyan/p/10416446.html
0
投稿
猜你喜欢
- 本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下1、概述决策树(decision tree)——是一种
- 现在大家都在讨论Web2.0 ,大家都在搞用户行为前端设计,现在注册一个ID一般只需要几秒钟,站长期望其产生高价值的UGC,形成一个只需要审
- 提取python字符串括号中的内容一些数据按字符串保存,如str1 = '(1, 0.123) (2, 0.234)',当我
- 如果你经常浏览网页一定见过很多网站在form表单中的文本域(textarea)中添加了的背景图片,一般是使用网站的logo,我记得我最早注意
- 先下载:http://signup.qq.com/js/a.js用 IntelliJ IDEA 格式化代码:var naa = true;O
- 1、配置环境支持python2和python3On Linux, Solaris, or FreeBSD, add the /usr/loc
- 本文实例讲述了Python快速排序算法。分享给大家供大家参考,具体如下:快速排序的时间复杂度是O(NlogN)算法描述:① 先从序列中取出一
- 目录一、前言二、基础命令三、正常显示中文:四、设置图样或子图五、设置x轴或y轴相关属性:六、设置标题:七、设置图例:八、进行标注:九、保存图
- 代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途。#cod
- 我就废话不多说了,直接上代码吧!#方法一def list_cut(mylist,count): length=len(mylis
- 论坛上看到有人问ASP是否可以定时触发事件,我就顺便做了一个玩玩。其实做这个的原理是很简单的,只是我们当时没有仔细的去想想该怎么实现,我这里
- 这次我们讨论的是,区分有单选框的选项和普通的选项~~乍听起来,可能不太理解我说了什么,下面举个例子先~~1、标签的单选~~例如QQ秀的支付流
- xlsxwriter可能用过的人并不是很多,不过使用后就会感觉,他的功能让你叹服,除了可以按要求生成你所需要的excel外还可以加上很形象的
- HTML5 中 div section article 的区别刚刚开始接触 HTML5 时,对它的标签很不适应,甚至一度有点反感。尤其是对
- 以SQL Server中的Northwind示范数据库为例,利用DTS设计器,进行数据的转移。转移任务的步骤:◆1. 新建目的数据库NOrt
- openpyxl模块离线安装背景:公司的防火墙限制,无法使用pip在线安装,开墙的审批流程较为繁琐,故采取离线安装的方式。步骤如下:1、官网
- 前言本文主要给大家介绍关于Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相关内容,分享出来供
- def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(&quo
- 比如有两个模块,一个aa.py,一个bb.py 代码如下:aa.py:#encoding:utf-8import bba=1bb.py:#e
- Boundary MatchersJava regex API还支持边界匹配。如果我们关心在输入文本中匹配的确切位置,那么这就是我们要寻找的