django基于存储在前端的token用户认证

一.前提

首先是这个代码基于前后端分离的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/Paul-watermelon/p/11302449.html

时间: 2024-11-01 16:31:36

django基于存储在前端的token用户认证的相关文章

django之基于cookie和装饰器实现用户认证

一.使用Django自带的decorator 通常情况,使用 函数定义的view,可以直接使用 login_required 直接装饰 @login_required def index(request): if request.method == "GET": return render(request, "index.htm") def user_login(request): if request.method == "GET": retu

python2.0_day18_Django自带的用户认证模块的使用

用户验证我们基于一个项目来学习利用Django框架中的user表实现用户认证Django练习小项目:学员管理系统设计开发 项目需求: 1.分讲师\学员\课程顾问角色, 2.学员可以属于多个班级,学员成绩按课程分别统计 3.每个班级至少包含一个或多个讲师 4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员 5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存 6.每个学员的所有上课出勤情况\学习成绩都要保存 7.学校可以有分校区,默认每个校区的员工只能查看和管理自己校区的学员 8.客

apache用户认证访问机制

Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/www(apache的主页根目录)下建立一个test目录mkdir /var/www/test第2步然后我们编辑httpd.conf添加Alias /test"/var/www/test"Options Indexes MultiViewsAllowOverride AuthConfig #表

用户认证auth模块

auth模块引入 from django.contrib import auth authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象,如果用户不存在返回一个空authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的.当我们试图登陆一个从数据库中直接取出来不经过authenticate()的U

django 基于proxy实现用户权限管理

项目中经常会遇到用户权限管理的问题,django adminsite已经提供非常实用的用户权限管理机制.不过有些时候,我们希望根据相关用户属性来过滤adminsite中显示的内容.下文将结束如何实现: 原始类 假设我有这么一个问卷类,基于这个类可以实现增删改查的功能 class wenjuan(models.Model): """ 问卷 """ name=models.CharField(u'问卷名称',max_length=128) breif

5分钟搞懂:基于token的用户认证

用户认证 用户认证或者说用户登录是确认某人确实是某人的过程,生活中靠身份证,网络上就要靠账号和密码.用户提供账号和密码,网站通过与数据库中保存的账号与密码比对确认用户身份. 基于token的用户认证 基于token的用户认证原理很简单.让用户输入账号和密码,然后获得一个token(令牌),该token允许用户在不使用账号和密码的情况下访问特定的资源.一旦获得token,用户就获得了在一段时间内对特定资源的访问权限. 这个过程类似酒店开房,在酒店前台认证身份.登记入住,这个步骤相当于网站的登录,然

Django基于Cookie装饰器实现用户认证

def login(request): if request.method =="GET": return render(request,"login.html") elif request.method == "POST": u = request.POST.get("user") p = request.POST.get("password") print(u,p) if u ==user and p

061.Python前端Django组件用户认证组件

一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---

使用 AngularJS &amp; NodeJS 实现基于 token 的认证应用(转)

认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构建的完整的应用. 一.传统的认证系统 在开始说基于 token 的认证系统之前,我们先看一下传统的认证系统. 用户在登录域输入 用户名 和 密码 ,然后点击 登录 : 请求发送之后,通过在后端查询数据库验证用户的合法性.如果请求有效,使用在数据库得到的信息创建一个 session,然后在响应头信息中