认证

任何的项目都需要认证,当用户输入了用户名和密码,验证通过,代表用户登录成功

那HTTP请求是无状态的,下次这个用户再请求,是不可能识别这个用户是否登录的

就要有自己的方式来实现这个认证,用户登录成功以后,生成一个随机字符串,以后这个用户再请求,都要携带这个随机字符串。

就可以根据这个字符串进行判断这个用户是否登录,目的是前端发送请求的时候带过来就可以,以前的cookie,session是的一种解决方案,认证的时候也用过token的这种解决方案。

token

用户登录成功后,生成一个随机字符串token给前端返回

那么前端以后都携带这个token来访问这样只需要鉴别这个token来做认证

前端如果发送请求把token放在请求头中看下的认证要怎么写

序列化注册数据

测试的时候用的重写create方法,真正开发前端传过来的就是加密后的密文密码
from rest_framework import serializers
from Course.models import Account
import hashlibclass RegisterSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = "__all__"def create(self, validated_data):pwd = validated_data["pwd"]pwd_salt = "luffy_password" + pwd   # 加盐处理md5_str = hashlib.md5(pwd_salt.encode()).hexdigest()user_obj = Account.objects.create(username=validated_data["username"], pwd=md5_str)return user_obj

Login/serializers.py

注册,登录的视图

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import RegisterSerializer
from utils.base_response import BaseResponse
from Course.models import Account
from utils.redis_pool import POOL
import redis
import uuid
from utils.my_auth import LoginAuth
from utils.geetest import GeetestLib
from django.http import HttpResponse
import json# Create your views here.class RegisterView(APIView):def post(self, request):res = BaseResponse()   # 实例化响应类# 用序列化器做校验ser_obj = RegisterSerializer(data=request.data)if ser_obj.is_valid():ser_obj.save()res.data = ser_obj.dataelse:res.code = 1020res.error = ser_obj.errorsreturn Response(res.dict)class LoginView(APIView):def post(self, request):res = BaseResponse()username = request.data.get("username", "")pwd = request.data.get("pwd", "")user_obj = Account.objects.filter(username=username, pwd=pwd).first()if not user_obj:res.code = 1030res.error = "用户名或密码错误"return Response(res.dict)# 用户登录成功生成一个token写入redis# 写入redis  token : user_idconn = redis.Redis(connection_pool=POOL) # 从连接池获取一个连接try:token = uuid.uuid4()conn.set(str(token), user_obj.id, ex=10000)# conn.set(str(token), user_obj.id)          # str(token) 用作keyres.data = tokenexcept Exception as e:print(e)res.code = 1031res.error = "创建令牌失败"return Response(res.dict)

Login/views.py

class BaseResponse(object):"""封装响应的类"""def __init__(self):self.code = 1000self.data = Noneself.error = None@propertydef dict(self):return self.__dict__        # 返回字典

utils/base_response.py

认证器

http头部发送的字段信息 key:value

在服务器接受时,需要加上前缀(并且大写)例如 HTTP_KEY ,通过 request.META.get(HTTP_KEY) 获取值

import redisfrom rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailedfrom .redis_pool import POOL
from Course.models import AccountCONN = redis.Redis(connection_pool=POOL)class LoginAuth(BaseAuthentication):def authenticate(self, request):# 从请求头中获取前端带过来的token。或者跟前端商量好token = request.META.get("HTTP_AUTHENTICATION", "")# print(request.META)# print(token)if not token:raise AuthenticationFailed("没有携带token")# 去redis比对user_id = CONN.get(str(token))  # get没有的值返回 Noneif user_id == None:raise AuthenticationFailed("token过期")  # 重新登录设置tokenuser_obj = Account.objects.filter(id=user_id).first()return user_obj, token

utils/my_auth.py

用到的redis连接池

import redisPOOL = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True, max_connections=10)

utils/redis_pool.py

注册用户测试

测试发送密码时为密文。前端传过来,后端加密后再与数据库中的比对

以token为key存放在redis中,登录成功后返回生成的token数据(有有效期的),下次登录时携带上。后端以传过来的token 去reids中找,能找到就拿到用户信息,不能就说明过期需要重新登录,或者token不存在.

qhfl-4 注册-登录-认证相关推荐

  1. 简单设计实现基于Forms认证的注册登录等用户基础服务

    前一段时间博客园新闻里看到的雄文:你会做Web上的用户登录功能吗? 弱弱地表示,按照文章中的标准,写了这么长时间的程序,还真的不完全会写web上的用户登录功能,或者说不能完全按照这个标准写出复杂的登录 ...

  2. Django框架(十八)—— auth框架:用户登录、注册、认证

    auth模块 一.什么是author模块 Auth模块是Django自带的用户认证模块,可以实现包括用户注册.用户登录.用户认证.注销.修改密码等功能.默认使用 auth_user 表来存储用户数据. ...

  3. 云闪付持卡人认证信息失败_云闪付app注册登录常见问答

    云闪付app注册登录常见问答 1.如何注册成为云闪付App用户? 持卡人可通过以下方式注册成为云闪付APP用户: (1)通过持卡人服务网站(www.95516.com): (2)通过云闪付App. 通 ...

  4. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  5. jwt认证机制优势和原理_微服务统一登录认证怎么做?JWT?

    无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...

  6. 微服务权限控制(二)共享Session方式的登录认证

    接上一篇的权限控制,再讨论再网关zuul的登录认证实现. 网关使用SpringCloud的zuul,登录认证选择使用自定义共享session的方式,来实现集群的登录验证.保护接口的私密,保证系统安全. ...

  7. 密码学-网站的安全登录认证设计

    用户登录是任何一个应用系统的基本功能,特别是对于网上银行系统来说,用户登录的安全性尤为重要.如何设计一个网站的安全登录认证程序,是本文主要讨论的问题. 静态密码存在着比较多的安全隐患,攻击者有很多手段 ...

  8. 网站的安全登录认证设计

    用户登录是任何一个应用系统的基本功能,特别是对于网上银行系统来说,用户登录的安全性尤为重要.如何设计一个网站的安全登录认证程序,是本文主要讨论的问题. 静态密码存在着比较多的安全隐患,***者有很多手 ...

  9. 如何成为荣耀开发者:注册与认证常见问题

    荣耀开发者服务平台是荣耀面向开发者的统一生态入口,通过聚合周边内外部系统,分全球多站点部署,为全球开发者提供业务全生命周期的商业支撑服务,拥有应用分发.智慧服务.开放能力.HONOR Connect等 ...

最新文章

  1. 使用MATLAB实现的小算法练习1
  2. 摘自ubantuer-Linux防火墙iptables学习笔记(三)iptables命令详解和举例
  3. python的中文含义-python __all__ 含义
  4. 计算机设备管理程序在哪,电脑设备管理在哪,教您如何打开电脑设备管理
  5. 前端学习(3193):react的容器中的错误
  6. pos共识机制_OK区块链60讲 | 第17集:什么是PoS共识机制
  7. vue中$watch源码阅读笔记
  8. rstudio和matlab,R语言与matlab循环时间对比
  9. 用c#算成绩的总和_用c#输入几门课程成绩求总成绩和平均成绩,定义方法实现如果输入的成绩不是整数,则重新输入(方法)...
  10. 【新书推荐】Silverlight 4教程书籍推荐
  11. 2.1.3 JavaScript代码书写规则
  12. a form 出口享惠情况_关于“出口享惠情况”如何填报?
  13. 计算机3级数据库技术考哪些内容,计算机考试三级数据库技术考试大纲
  14. 看英文PDF利器 智器+ColorDict 辞典
  15. 管家婆辉煌 经营历程 Date exceeds maximum of 19-12-31 报错解决办法
  16. PC电脑版微信聊天记录迁移方法
  17. 十二星座的来历和希腊神话12主神简介
  18. iOS 蓝牙开发 BabyBluetooth蓝牙库介绍
  19. 【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
  20. KDA的新宠儿,金贝KD6,更大算力,探索无限可能

热门文章

  1. linux 页面内容输出,Node.js 一个简单的页面输出
  2. mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明
  3. undolog 是binlog_msyql日志-binlog-undolog-redolog
  4. kafka创建topic_一网打尽Kafka常用命令、脚本及配置,宜收藏!
  5. 计算机控制技术黄勤,微型计算机控制技术 教学课件 黄勤 第3章微型计算机控制系统的常用控制.ppt...
  6. 深入理解javascript原型和闭包(7)——原型的灵活性
  7. 肝!打造一款高逼格的Vim神器
  8. 【Git笔记1】本地项目与GitHub远程仓库互联
  9. 稀疏自编码器_基于tensorflow实现稀疏自编码和在推荐中的应用
  10. python替换缺失值_详解Pandas 处理缺失值指令大全