restframework-jwt执行流程

from rest_framwork_jwt.views import obtain_jwt_token, refresh_jwt_token, verity_jwt_token

obtain_jwt_token:签发token

refresh_jwt_token:刷新token

verity_jwt_token:验证token

签发流程

本质就是登录接口-->校验用户是否正确,如果正确签发token,如果不正确,返回错误

django中顶格写的代码直接执行

# obtain_jwt_token
核心代码:ObtainJSONWebToken.as_view()
ObtainJSONWebToken视图类,实现了登录的功能 class ObtainJSONWebToken(JSONWebTokenAPIView):
serializer_class = JSONWebTokenSerializer """父类ObtainJSONWebToken"""
class JSONWebTokenAPIView(APIView):
# 局部禁用掉权限和认证
permission_classes = ()
authentication_classes = ()
def get_serializer_context(self):
return {
'request': self.request,
'view': self,
} def get_serializer_class(self):
return self.serializer_class def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs) def post(self, request, *args, **kwargs):
# JSONWebTokenSerializer实例化得到一个序列号类的对象,传入前端传的只
serializer = self.get_serializer(data=request.data) if serializer.is_valid(): # 校验前端传入的数据是否合法:
#1 字段自己的规则 2 局部钩子 3 全局钩子(序列化类的validate方法)
# 获取当前登录用户和签发token是在序列化类中完成的
# 从序列化类对象中取出了当前登录用户
user = serializer.object.get('user') or request.user
# # 从序列化类对象中取出了token
token = serializer.object.get('token')
# 自定义过
response_data = jwt_response_payload_handler(token, user, request)
response = Response(response_data)
return response return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) """序列化类:JSONWebTokenSerializer"""
class JSONWebTokenSerializer(Serializer):
def validate(self, attrs):
credentials = {
'username': attrs.get('username'),
'password': attrs.get('password')
} if all(credentials.values()):
# auth的校验用户名和密码是否正确
user = authenticate(**credentials) if user:
# 通过用户获得payload:{}
payload = jwt_payload_handler(user)
return {
'token': jwt_encode_handler(payload),
'user': user
}
else:
# 根据用户名和密码查不到用户
raise serializers.ValidationError(msg)
else:
# 用户名和密码不传,传多了都不行
raise serializers.ValidationError(msg)

认证

    """认证类;JSONWebTokenAuthentication"""
class JSONWebTokenAuthentication(BaseJSONWebTokenAuthentication):
def get_jwt_value(self, request):
# get_authorization_header(request)根据请求头中HTTP_AUTHORIZATION,取出token
# jwt adsfasdfasdfad
# auth=['jwt','真正的token']
auth = get_authorization_header(request).split()
auth_header_prefix = api_settings.JWT_AUTH_HEADER_PREFIX.lower()
if not auth:
if api_settings.JWT_AUTH_COOKIE:
return request.COOKIES.get(api_settings.JWT_AUTH_COOKIE)
return None
if smart_text(auth[0].lower()) != auth_header_prefix:
return None
if len(auth) == 1:
msg = _('Invalid Authorization header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
elif len(auth) > 2:
msg = _('Invalid Authorization header. Credentials string '
'should not contain spaces.')
raise exceptions.AuthenticationFailed(msg)
return auth[1] """父类中:BaseJSONWebTokenAuthentication---》authenticate"""
class BaseJSONWebTokenAuthentication(BaseAuthentication):
def authenticate(self, request):
# jwt_value前端传入的token
jwt_value = self.get_jwt_value(request)
# 前端没有传入token,return None,没有带token,认证类也能过,所有咱们才加权限类
if jwt_value is None:
return None
try:
payload = jwt_decode_handler(jwt_value) # 验证token,token合法,返回payload
except jwt.ExpiredSignature:
msg = _('Signature has expired.')
raise exceptions.AuthenticationFailed(msg)
except jwt.DecodeError:
msg = _('Error decoding signature.')
raise exceptions.AuthenticationFailed(msg)
except jwt.InvalidTokenError:
raise exceptions.AuthenticationFailed() user = self.authenticate_credentials(payload) # 通过payload得到当前登录用户 return (user, jwt_value) # 后期的request.user就是当前登录用户 # 它这个认证类:只要带了token,request.user就有只,如果没带token,不管了,继续往后走

设置过期时间

签发的token,有过期时间,过期时间是?配置一般设为7天,默认是五分钟

'JWT_AUTH = {

'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),

}'

双token认证

用户正在app或者应用中操作 token突然过期,此时用户不得不返回登陆界面,重新进行一次登录,这种体验性不好,于是引入双token校验机制

实现原理:首次登陆时服务端返回两个token ,accessToken和refreshToken,accessToken过期时间比较短,refreshToken时间较长,且每次使用后会刷新,每次刷新后的refreshToken都是不同

refreshToken假设7天,accessToken过期时间5分钟
以后带着accessToken访问就好了,校验也是accessToken,
当accessToken过期了,校验refreshToken,然后在生成一个accessToken当。
refreshToken过期以后,refreshToken与accessToken一起过期的机率比较小,如果真的同时失效了,那就重新登录一次。
正常使用accessToken即可,如果accessToken过期了,重新发请求,携带refreshToken过来,能正常返回,并且这次响应中又带了acessToken

restframework-jwt执行流程(签发流程、认证)、双token认证、过期时间的更多相关文章

  1. 29.Jwt集成(3):token设置过期时间、异常判断

    token设置过期时间 package main import ( "fmt" "github.com/dgrijalva/jwt-go" "io/i ...

  2. 接口测试基础——session认证和token认证

    总算是把这个过程理清楚了,现在我们的思路是:what?why?How?,实际上这些个机制产生的内部逻辑是从下至上的的:遇到问题了,想办法解决,总结归纳并取名.从解决一些小问题开始生长,不断打补丁直至完 ...

  3. 034.认证方式 | 基本认证 、Token认证、 AK/SK认证

    认证方式 关于认证: https://www.cnblogs.com/badboyh2o/p/11068779.html https://www.cnblogs.com/badboyh2o/p/110 ...

  4. JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案

    一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...

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

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

  6. 应用JWT进行用户认证及Token的刷新

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

  7. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新

    来源:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_26.html 本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及T ...

  8. 使用jwt进行token认证

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

  9. 面试官所问的--Token认证

    写这一篇文章的来源是因为某一天的我被面试官提问:让你设计一个登录页面,你会如何设计? 我当时的脑子只有??? 不就是提交账号.密码给后台就搞定了呢? 不可能那么简单,我弱弱的想,难道要对密码加密?? ...

  10. 42.JSON Web Token认证

    JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...

随机推荐

  1. PostGIS栅格数据类型解析【raster】

    PostGIS 栅格数据类型解析:结构.转换与应用 一.栅格数据类型概述 在 PostGIS 中,raster 是用于存储和处理栅格数据的核心类型,支持从多种格式(如 JPEG.GeoTIFF.PNG ...

  2. AI写程序: 多线程网络扫描网段ip工具

    IP Scanner - 多线程网络扫描工具 项目简介 IP Scanner 是一个基于 Python 开发的网络扫描工具,它能够快速扫描指定网段内的活动 IP 地址.该工具采用多线程技术提高扫描效率 ...

  3. Git回滚命令reset|回退代码到某次commit

    摘要:使用Git回退命令reset回退代码到某次commit.   需求背景: 需要回滚提交的代码的场景常常是如下三个: 提交代码到错误Git分支: 提交的代码不需要上线了,而同一分支有需要上线的代码 ...

  4. Intellij IDEA 设置JDK版本

    问题描述: 项目JDK版本不对 如果项目JDK版本不兼容,在编译或者启动项目的时候抛出如下异常提示信息: Error:(29, 34) java: -source 1.7 中不支持 lambda 表达 ...

  5. pyqt Qscintilla英文学习笔记

    由于博客园不能上传pdf,所以图片没了,源文件 链接:https://www.123pan.com/s/qdY9-P4fk3 提取码:aRny 通过百度网盘分享的文件:qscintil- 链接:htt ...

  6. 洛谷 P3792 由乃与大母神原型和偶像崇拜

    洛谷 P3792 由乃与大母神原型和偶像崇拜 Problem 糖果屋的故事讲的就是韩赛尔和格雷特被继母赶出家里,因为没饭吃了,然后进了森林发现了一个糖果屋,里面有个女巫,专门吃小孩子 然而如果我们仔细 ...

  7. 【深度评测】Joomla Auto Readmore插件:自动提取缩略图+智能摘要,双引擎驱动内容效率革命

    "文章缩略图与摘要分离管理.重复上传图片.移动端封面图比例失调--"这些Joomla站长的经典痛点,如今被Auto Readmore插件的全自动缩略图提取功能彻底终结.本文将深度解 ...

  8. 数据库的DML与DQL语句

    1: DML语句 ​ insert into values 1 insert into 表 values(值1,值2,值n); 2 insert into 表(字段1,字段2,字段n) values( ...

  9. C# 托盘图标缓存清除

    https://blog.csdn.net/weixin_42953003/article/details/119676004 using System; using System.Collectio ...

  10. 京东携手HarmonyOS SDK首发家电AR高精摆放功能

    在电商行业的演进中,商品的呈现方式不断升级:从文字.图片到视频,再到如今逐渐兴起的3D与AR技术.作为XR应用探索的先行者,京东正站在这场体验革新的最前沿,不断突破商品展示的边界,致力于通过创新技术让 ...