登录的token操作

  1. #app.models.py :表结构
  2. from django.db import models
  3. class User(models.Model):
  4. user = models.CharField(max_length=32)
  5. password = models.CharField(max_length=32)
  6. def __str__(self):
  7. return self.user
  8. class UserToken(models.Model):
  9. token = models.CharField(max_length=64)
  10. user = models.OneToOneField(to='User')
  11.  
  12. #app.objectjson.py :序列化模块
  13. from rest_framework import serializers
  14. from app import models
  15. class UserJson(serializers.ModelSerializer):
  16. class Meta:
  17. model = models.User
  18. fields = '__all__'
  19.  
  20. #app.views.py
  21. from rest_framework.views import APIView
  22. from rest_framework.response import Response
  23. from app import models, common, objectjson
  24.  
  25. class Login(APIView):
  26. def post(self, request):
  27. data_dic = request.data
  28. user = models.User.objects.filter(**data_dic).first()
  29. if user:
  30. # 登录成功操作token
  31. token = common.get_token()
  32. # token的数据库操作,第一次产生token是新建,再次就是更新
  33. models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
  34. user_data = objectjson.UserJson(user).data
  35. return Response({
  36. 'status': 0,
  37. 'message': 'login success',
  38. 'token': token, # 将token返回给前台
  39. 'results': user_data
  40. })
  41. return Response({
  42. 'status': 1,
  43. 'message': 'login failedr'
  44. })

认证方法的实现

  1. #源码分析
  2. # as_view()=> APIView.dispatch => self.initial(request,*args,**kwargs) => 封装后的drf的request => request.user => self._authenticate() => authenticate(self,reuquest)的源码根据地
  3.  
  4. #app.views.py
  5. from rest_framework.authentication import BaseAuthentication
  6. from rest_framework.exceptions import AuthenticationFailed
  7.  
  8. class LoginAuthenticate(BaseAuthentication):
  9. def authenticate(self, request):
  10. # 登录逻辑:如果用户登录了,登录操作产生了token,且前后台同步了
  11. # 登录判断:再次发生请求,没有token代表没登录,错误token,代表无效的登录,token正确才是正常的登录用户
  12. # 如何将token取出,规定token用请求头传递
  13. token = request.META.get('HTTP_TOKEN')
  14. result = models.UserToken.objects.filter(token=token).first()
  15. print(result)
  16. if result:
  17. # 认证通过,可以返回None(有多个认证时),可以返回两个值:user,auth
  18. return result.user, token
  19. else:
  20. # 认证失败,抛出APIException或其子类对象
  21. raise AuthenticationFailed('认证失败')
  22.  
  23. class Books(APIView):
  24. authentication_classes = [LoginAuthenticate]
  25.  
  26. # 视图函数处理的逻辑
  27. def get(self, request):
  28. # 通过认证后,用request.user拿到当前登录的用户,用request.auth拿到认证值(该值通常自定义)
  29. print(request.user)
  30. return Response({
  31. 'status': 0,
  32. 'message': 'ok',
  33. 'results': []
  34. })

局部认证

  1. #app.auth.py 完成校验的所有逻辑
  2. from rest_framework.authentication import BaseAuthentication
  3. from rest_framework.exceptions import AuthenticationFailed
  4. from app import models
  5. class LoginAuthenticate(BaseAuthentication):
  6. def authenticate(self, request):
  7. token = request.META.get('HTTP_TOKEN')
  8. result = models.UserToken.objects.filter(token=token).first()
  9. print(result)
  10. if result:
  11. return result.user, token
  12. else:
  13. raise AuthenticationFailed('认证失败')
  14.  
  15. class Books(APIView):
  16. #添加登录认证即可
  17. authentication_classes = [auth.LoginAuthenticate]
  18. def get(self, request):
  19. print(request.user)
  20. return Response({
  21. 'status': 0,
  22. 'message': 'ok',
  23. 'results': []
  24. })

全局认证

  1. # 1.在settings.py中配置
  2. # 全局认证
  3. REST_FRAMEWORK = {
  4. 'DEFAULT_AUTHENTICATION_CLASSES': (
  5. 'rest_framework.authentication.SessionAuthentication',
  6. 'rest_framework.authentication.BasicAuthentication',
  7. 'app.auth.LoginAuthenticate'
  8. ),
  9. }
  10. #2.所有的CBV类都不需要添加类属性:authentication_classes
  11. # 局部禁用
  12. # 3.在不需要认证的CBV类中添加类属性:authentication_classes =[]

注销:在全局认证情况下

  1. class Logout(APIView):
  2. # 在全局认证情况下,如果能走get方法,代表已经通过登录认证(登录状态),就可以注销
  3. def get(self, request):
  4. models.UserToken.objects.update_or_create(user=request.user, defaults={'token': common.get_token()})
  5. return Response({
  6. "status": 0,
  7. "msg": 'logout success',
  8. })

JWT

  1. # jwt: json web tokens
  2. # jwt规范:就是对token的规范,头.体.签名
  3. '''
  4. 1.token一定是后台产生,拥有请求认证,所以要前后台统一
  5. 2.token的组成部分通常有三分部组成:header.payload.signature
  6. 3.header:{"token的加密方式": "base64", "是否有签名": True} 加密处理后的结果
  7. 4.payload:{"账号": *, "密码": *, "发行者": *, "过期时间": *, "浏览器信息": *} 加密处理后的结果
  8. 5.signature:{"header": *, "payload": *, "salt": *} 加密处理后的结果
  9.  
  10. eg: eyJ0eXAiOiJK.eyJ1c2VyX2lkIjoxLCJ1cNTgzMDM1NDR9.4j5QypLwuf
  11. '''

JWT-token操作

  1. # 安装 djangorestframework-jwt
  2. # -- pip3 install djangorestframework-jwt
  3.  
  4. # 采用 djangorestframework-jwt框架 产生 jwt规范的 token
  5. from rest_framework_jwt.settings import api_settings
  6. def get_jwt_token(user):
  7. # 自定义生成token,基于某user对象,且该user对象必须有username、password两个字段
  8. jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  9. jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  10. payload = jwt_payload_handler(user)
  11. token = jwt_encode_handler(payload)
  12. return token

token认证、JWT的更多相关文章

  1. 二.3.token认证,jwt认证,前端框架

    一.token: 铺垫: 之前用的是通过最基本的用户名密码登录我的运维平台http://127.0.0.1:8000/---这种用的是form表单,但是这种对于前后端分离的不适合.前后端分离,应该通过 ...

  2. Django+JWT实现Token认证

    对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...

  3. JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计

    原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...

  4. 程序员过关斩将--更加优雅的Token认证方式JWT

    菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...

  5. JWT的优点和实现Token认证的安全问题

    JWT的优点和实现Token认证的安全问题 一.什么是JWT JWT——Json web token  是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应 ...

  6. token 与 基于JWT的Token认证

    支持跨域访问,无状态认证 token特点 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输 无状态(也称:服务端可扩展行): ...

  7. iOS 开发之基于JWT的Token认证机制及解析

    在移动端和服务端通信中,一般有两种认证方式:token 和 session. 1.session/cookie 认证机制: 在服务端创建一个Session对象,同时在客户端的浏览器端创建一个Cooki ...

  8. 基于JWT的Token认证机制及安全问题

    [干货分享]基于JWT的Token认证机制及安全问题 https://bbs.huaweicloud.com/blogs/06607ea7b53211e7b8317ca23e93a891

  9. 使用jwt进行token认证

    简单说明:最近在搞权限这一块的东西,需要用到jwt进行token认证,才有了如下的demo演示   具体细节可以看gitbug,噗,不是bug是hub  github地址:https://github ...

  10. asp.net core 3.1 自定义中间件实现jwt token认证

    asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...

随机推荐

  1. openvswitch 流表操作

    流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ...

  2. Helix QAC/QAC++—代码静态测试工具介绍—符合功能安全标准MISRA ISO26262

    Helix QAC是静态代码分析工具,依据C和C++编码规则自动扫描代码对规则的违背.开发团队在开发过程的早期就可以用它来检测缺陷,因为此时修改代码是最方便也最经济的.Helix QAC因此自动化强制 ...

  3. 学习seo赚钱一定要有超前的思路和眼光

    http://www.wocaoseo.com/thread-100-1-1.html        日子过的真是快,一天又一天,一年又一年,虽然过年的脚步将近,火车票的问题还是没有解决,昨天忙活了半 ...

  4. Fastlane- app自动编译、打包多个版本、上传到app store

    Fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化打包.发布等工作,可以节省大量的时间. Github:https://github.com/fastlane/fa ...

  5. Google解析Json库Gson

    1.资料 官网: http://groups.google.com/group/google-gson 代码: https://github.com/google/gson jar包下载: http: ...

  6. MAC 上编译安装nginx-rtmp-module 流媒体服务器

    MAC 上编译安装nginx-rtmp-module 流媒体服务器 记录踩坑过程 下载nginx和nginx-rtmp-module wget http://nginx.org/download/ng ...

  7. Oracle重做日志和日志挖掘

    重做日志-Redo log 首先给出参考资料: 1.Oracle官网-Managing the Redo Log 为什么需要redo log 内存中数据修改后,不必立即更新到磁盘---效率 由日志完成 ...

  8. Pycharm安装opencv与 无法安装PIL以及安装Pillow之后依然报错的解决办法

    Pycharm 安装opencv pycharm里自带了很方便的安装第三方库的方法,不需要自己去下载opencv包再pip install 在pycharm的File/Settings/Project ...

  9. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

  10. 原生JDK网络编程- NIO

    什么是NIO? NIO 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.NIO翻译成 no-blocking io 或 ...