Django rest-framework的jwt认证

目录

  • jwt认证

    • jwt认证和普通session认证的区别
    • jwt认证组成
    • jwt的签发算法
      • 头部算法
      • 载荷部分的算法
      • 签名部分的算法
      • 连接生成token
    • jwt的校验算法
      • 切分
      • 解密头部
      • 解密载荷
      • 碰撞校验签名
      • 校验用户对象
    • jwt的刷新算法
    • jwt认证的优点
  • DRF中的jwt认证
    • 工作原理

jwt认证

jwt 是json web token的缩写,是一种登录认证的认证方式

jwt认证和普通session认证的区别

  1. session需要保存至服务端数据库中,而jwt服务器不需要存储token,服务器的IO操作会减少(没有IO写操作)
  2. 由客户端存储token信息,服务端只存储签发和校验的算法,服务端代码执行效率高
  3. 采用三段式,token中必须包含过期时间,保证token的安全性和时效性

jwt认证组成

  • jwt 由 头.载荷.签名 三部分组成,中间由 .拼接而成
  • 每部分都是一个json字典,头和载荷采用base64可逆加密算法加密,签名采用HS256不可逆加密算法算法

jwt认证组成介绍:

  • jwt头:包含一些无关紧要说明性的信息:公司名称、开发者信息,内容也可以为空
  • jwt载荷:包含核心信息:用户主键、账号信息、客户端设备信息、token的过期时间等
  • jwt签名:包含安全信息,头的加密结果,载荷的加密结果、服务器的安全码(盐)

jwt的签发算法

总共分为4部,只有在用户重新登录时才会再次签发新的token,如果原token没有超过过期时间,也是有效的,并且会在每个需要登录的接口中客户端会携带token与服务端校验

头部算法

  • 头部内容:公司名称、项目信息,也可以为空
  • 将这些数据转换为json字符串,再讲json字符串加密成base64字符串

载荷部分的算法

  • 载荷部分的内容:用户账号、客户端设备信息、用户主键信息(需要提供用户账号并验证ton过后才可以拿到)、过期时间(根据当前时间与配置的过期时间相结合产生)
  • 将这些数据转换为json字符串,再讲json字符串加密成base64字符串

签名部分的算法

  • 签名部分的内容:将头部内容加密结果,载荷部分内容加密结果作为成员,再从服务器上获取安全码
  • 将这些数据转换为json字符串,再讲json字符串加密成不可逆的HS256字符串

连接生成token

  • 将三个字符串用.拼接产生三段式token

jwt的校验算法

总共可以分为五部来做:

切分

  • 从客户端提交的请求中拿到token,用.切割成三段,如果不是三段,非法token

解密头部

看情况,一般不需要解密,因为固定不变的。

解密载荷

  • 先用base64解密成json字符串,再转换成python格式的字典数据

    • 查询User表确定用户账号是否存在
    • 本次请求的信息和解密后的载荷中的信息比对,确定是否是同一用户或设备,决定对用户是否做安全提示(eg:异地登录)
    • 过期时间与当前时间比对,判断该token是否在有效时间内

碰撞校验签名

  • 将用户最新提交的token中头、载荷、服务端的安全码组成字典转换成json字符串
  • 采用不可逆HS256加密算法对新组成的json字符串加密产生新的签名字符串
  • 新的签名字符串与第三段签名碰撞比对,一致的话才能确保token是合法的。

校验用户对象

  • 以上算法都通过后,载荷校验得到的User对象,就是该token代表的登录用户(django中一般把登录用户存放在request.user中)

jwt的刷新算法

刷新算法就是在前发完token后,在token的有效时间内,用户每次提交请求时都会刷新该token的有效时间

刷新算法的实现:

  • 要在签发token的载荷中,额外添加两个时间信息:第一次签发token的时间,最多往后刷新的有效时间
  • 每次请求携带token不仅走校验算法验证token,还要额外请求刷新token的接口,完成token的刷新
  • 服务器不仅要配置过期时间,还要配置最长刷新时间

jwt认证的优点

  • 数据库不需要存储token,没有IO写操作
  • 客户端存储token,服务器只存储签发与校验的算法,代码执行效率高
  • 签发与校验算法在多个服务器上统一,在jwt规则下服务器做集群非常便捷

DRF中的jwt认证

安装

pip3 install djangorestframework-jwt

使用自带设定好的jwt

from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
    url(r'^login/',obtain_jwt_token),
]
'''
path('login/', obtain_jwt_token)其实相当于path('login/', ObtainJSONWebToken.as_view())
因为我们之间进源码可以看到
obtain_jwt_token = ObtainJSONWebToken.as_view()     #获得
refresh_jwt_token = RefreshJSONWebToken.as_view()   #刷新
verify_jwt_token = VerifyJSONWebToken.as_view()     #验证
'''

测试接口:post请求

postman发生post请求
接口:http://127.0.0.1:8000/api/login/

数据:
{
    "username":"admin",
    "password":"admin123"
}

返回一个token字符串
{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTc3ODc0MzU0LCJlbWFpbCI6IiJ9.5z8Ya-mxj-oPSOwdXenSKUWf7M5pt3r8YVlFKu1cskY"
}

工作原理

"""
jwt:json web tokens 采用json格式在web上传输的 认证字符串

jwt字符串:头.载荷.签名

头:公司基本信息、项目组基本信息、常规加密算法名
载荷:用户信息、过期时间
签名:头、载荷、秘钥

{头信息字典,采用base64加密算法}.{载荷信息字典,采用base64加密(base64编码)}.{头加密串、载荷加密串、服务器秘钥,采用hs256加密算法}

base64是可逆的
hash256是不可逆加密
我们一般只会将账号信息,过期时间放载荷里面,一般把密码什么重要信息丢签名里面

原文地址:https://www.cnblogs.com/ghylpb/p/12154343.html

时间: 2024-08-04 11:12:41

Django rest-framework的jwt认证的相关文章

Django REST framework 之JWT认证

Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名.它具备两个特点: 简洁(Compact) 可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快 自包含(Self-contained) 负载中包含了所有用户所需要的信息,避免了多次查询数据库 2.JWT 组成

Django rest framework 使用自定义认证方式

Django rest framework 使用自定义认证方式 Django使用自定义认证方式 介绍了 "Django使用自定义认证方式",这一篇说说怎样在前一篇的基础上提供rest api. 修改settings.py中INSTALLED_APPS,添加 'login' app. 给login app增加serializers.py文件 #coding:utf-8 from django.contrib.auth.models import User from rest_framew

Django REST framework 之 API认证

RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS 来防止 man-in-the-middle(MitM)中间人攻击. 通

Django REST framework 的TokenAuth认证及外键Serializer基本实现

一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用. app_name = models.ForeignKey("cmdb.App",related_name='deploy_app', verbose_name="App") 二,Settings.py文件中,加入对Django REST framework的基本设置. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSE

Django REST framework JWT

Django REST framework JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便

django项目之配置jwt的token认证

1.简介jwt                                                                                                              Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import

源码剖析Django REST framework的认证方式及自定义认证

源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_view方法,根据面向对象中类的继承可以知道,则会执行其父类View中的as_view方法 在Django的View的as_view方法中,又会调用dispatch方法. 现在来看看Django restframework的认证流程 Django restframework是基于Django的框架,所以基

django rest framework 用户认证

BaseAuthentication 类: django rest framework 通过 BaseAuthentication 实现认证功能 无论是自定义的认证类还是 rest framework 自带的认证类都应该继承 BaseAuthentication BaseAuthentication 中有两个方法 authenticate 和 authenticate_header, 其中 authenticate 方法必须实现 如果用户需要自定义认证方法则继承 BaseAuthenticati

Django rest framework源码分析(一) 认证

一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧.我承认我是故意的,因为我始终觉得,如果好的技术服务于企业,顺便的提高一下自己.大家都很开心不是不.再次强调一下,真的只是顺便. 安装吧 pip install djangorestframework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework