token认证、JWT
登录的token操作
- #app.models.py :表结构
- from django.db import models
- class User(models.Model):
- user = models.CharField(max_length=32)
- password = models.CharField(max_length=32)
- def __str__(self):
- return self.user
- class UserToken(models.Model):
- token = models.CharField(max_length=64)
- user = models.OneToOneField(to='User')
- #app.objectjson.py :序列化模块
- from rest_framework import serializers
- from app import models
- class UserJson(serializers.ModelSerializer):
- class Meta:
- model = models.User
- fields = '__all__'
- #app.views.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from app import models, common, objectjson
- class Login(APIView):
- def post(self, request):
- data_dic = request.data
- user = models.User.objects.filter(**data_dic).first()
- if user:
- # 登录成功操作token
- token = common.get_token()
- # token的数据库操作,第一次产生token是新建,再次就是更新
- models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
- user_data = objectjson.UserJson(user).data
- return Response({
- 'status': 0,
- 'message': 'login success',
- 'token': token, # 将token返回给前台
- 'results': user_data
- })
- return Response({
- 'status': 1,
- 'message': 'login failedr'
- })
认证方法的实现
- #源码分析
- # as_view()=> APIView.dispatch => self.initial(request,*args,**kwargs) => 封装后的drf的request => request.user => self._authenticate() => authenticate(self,reuquest)的源码根据地
- #app.views.py
- from rest_framework.authentication import BaseAuthentication
- from rest_framework.exceptions import AuthenticationFailed
- class LoginAuthenticate(BaseAuthentication):
- def authenticate(self, request):
- # 登录逻辑:如果用户登录了,登录操作产生了token,且前后台同步了
- # 登录判断:再次发生请求,没有token代表没登录,错误token,代表无效的登录,token正确才是正常的登录用户
- # 如何将token取出,规定token用请求头传递
- token = request.META.get('HTTP_TOKEN')
- result = models.UserToken.objects.filter(token=token).first()
- print(result)
- if result:
- # 认证通过,可以返回None(有多个认证时),可以返回两个值:user,auth
- return result.user, token
- else:
- # 认证失败,抛出APIException或其子类对象
- raise AuthenticationFailed('认证失败')
- class Books(APIView):
- authentication_classes = [LoginAuthenticate]
- # 视图函数处理的逻辑
- def get(self, request):
- # 通过认证后,用request.user拿到当前登录的用户,用request.auth拿到认证值(该值通常自定义)
- print(request.user)
- return Response({
- 'status': 0,
- 'message': 'ok',
- 'results': []
- })
局部认证
- #app.auth.py 完成校验的所有逻辑
- from rest_framework.authentication import BaseAuthentication
- from rest_framework.exceptions import AuthenticationFailed
- from app import models
- class LoginAuthenticate(BaseAuthentication):
- def authenticate(self, request):
- token = request.META.get('HTTP_TOKEN')
- result = models.UserToken.objects.filter(token=token).first()
- print(result)
- if result:
- return result.user, token
- else:
- raise AuthenticationFailed('认证失败')
- class Books(APIView):
- #添加登录认证即可
- authentication_classes = [auth.LoginAuthenticate]
- def get(self, request):
- print(request.user)
- return Response({
- 'status': 0,
- 'message': 'ok',
- 'results': []
- })
全局认证
- # 1.在settings.py中配置
- # 全局认证
- REST_FRAMEWORK = {
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework.authentication.SessionAuthentication',
- 'rest_framework.authentication.BasicAuthentication',
- 'app.auth.LoginAuthenticate'
- ),
- }
- #2.所有的CBV类都不需要添加类属性:authentication_classes
- # 局部禁用
- # 3.在不需要认证的CBV类中添加类属性:authentication_classes =[]
注销:在全局认证情况下
- class Logout(APIView):
- # 在全局认证情况下,如果能走get方法,代表已经通过登录认证(登录状态),就可以注销
- def get(self, request):
- models.UserToken.objects.update_or_create(user=request.user, defaults={'token': common.get_token()})
- return Response({
- "status": 0,
- "msg": 'logout success',
- })
JWT
- # jwt: json web tokens
- # jwt规范:就是对token的规范,头.体.签名
- '''
- 1.token一定是后台产生,拥有请求认证,所以要前后台统一
- 2.token的组成部分通常有三分部组成:header.payload.signature
- 3.header:{"token的加密方式": "base64", "是否有签名": True} 加密处理后的结果
- 4.payload:{"账号": *, "密码": *, "发行者": *, "过期时间": *, "浏览器信息": *} 加密处理后的结果
- 5.signature:{"header": *, "payload": *, "salt": *} 加密处理后的结果
- eg: eyJ0eXAiOiJK.eyJ1c2VyX2lkIjoxLCJ1cNTgzMDM1NDR9.4j5QypLwuf
- '''
JWT-token操作
- # 安装 djangorestframework-jwt
- # -- pip3 install djangorestframework-jwt
- # 采用 djangorestframework-jwt框架 产生 jwt规范的 token
- from rest_framework_jwt.settings import api_settings
- def get_jwt_token(user):
- # 自定义生成token,基于某user对象,且该user对象必须有username、password两个字段
- jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
- jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
- payload = jwt_payload_handler(user)
- token = jwt_encode_handler(payload)
- return token
token认证、JWT的更多相关文章
- 二.3.token认证,jwt认证,前端框架
一.token: 铺垫: 之前用的是通过最基本的用户名密码登录我的运维平台http://127.0.0.1:8000/---这种用的是form表单,但是这种对于前后端分离的不适合.前后端分离,应该通过 ...
- Django+JWT实现Token认证
对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...
- JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计
原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...
- 程序员过关斩将--更加优雅的Token认证方式JWT
菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...
- JWT的优点和实现Token认证的安全问题
JWT的优点和实现Token认证的安全问题 一.什么是JWT JWT——Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应 ...
- token 与 基于JWT的Token认证
支持跨域访问,无状态认证 token特点 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输 无状态(也称:服务端可扩展行): ...
- iOS 开发之基于JWT的Token认证机制及解析
在移动端和服务端通信中,一般有两种认证方式:token 和 session. 1.session/cookie 认证机制: 在服务端创建一个Session对象,同时在客户端的浏览器端创建一个Cooki ...
- 基于JWT的Token认证机制及安全问题
[干货分享]基于JWT的Token认证机制及安全问题 https://bbs.huaweicloud.com/blogs/06607ea7b53211e7b8317ca23e93a891
- 使用jwt进行token认证
简单说明:最近在搞权限这一块的东西,需要用到jwt进行token认证,才有了如下的demo演示 具体细节可以看gitbug,噗,不是bug是hub github地址:https://github ...
- asp.net core 3.1 自定义中间件实现jwt token认证
asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...
随机推荐
- openvswitch 流表操作
流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ...
- Helix QAC/QAC++—代码静态测试工具介绍—符合功能安全标准MISRA ISO26262
Helix QAC是静态代码分析工具,依据C和C++编码规则自动扫描代码对规则的违背.开发团队在开发过程的早期就可以用它来检测缺陷,因为此时修改代码是最方便也最经济的.Helix QAC因此自动化强制 ...
- 学习seo赚钱一定要有超前的思路和眼光
http://www.wocaoseo.com/thread-100-1-1.html 日子过的真是快,一天又一天,一年又一年,虽然过年的脚步将近,火车票的问题还是没有解决,昨天忙活了半 ...
- Fastlane- app自动编译、打包多个版本、上传到app store
Fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化打包.发布等工作,可以节省大量的时间. Github:https://github.com/fastlane/fa ...
- Google解析Json库Gson
1.资料 官网: http://groups.google.com/group/google-gson 代码: https://github.com/google/gson jar包下载: http: ...
- MAC 上编译安装nginx-rtmp-module 流媒体服务器
MAC 上编译安装nginx-rtmp-module 流媒体服务器 记录踩坑过程 下载nginx和nginx-rtmp-module wget http://nginx.org/download/ng ...
- Oracle重做日志和日志挖掘
重做日志-Redo log 首先给出参考资料: 1.Oracle官网-Managing the Redo Log 为什么需要redo log 内存中数据修改后,不必立即更新到磁盘---效率 由日志完成 ...
- Pycharm安装opencv与 无法安装PIL以及安装Pillow之后依然报错的解决办法
Pycharm 安装opencv pycharm里自带了很方便的安装第三方库的方法,不需要自己去下载opencv包再pip install 在pycharm的File/Settings/Project ...
- 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高
https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...
- 原生JDK网络编程- NIO
什么是NIO? NIO 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.NIO翻译成 no-blocking io 或 ...