热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jwt认证

目录jwt认证示意图jwt认证算法:签发与检验drf项目的jwt认证开发流程(重点)drf-jwt框架基本使用token刷新机制(了解)jwt优势1没有数据库写操作,高效2服务器不

目录
  • jwt 认证示意图
  • jwt 认证算法:签发与检验
  • drf 项目的 jwt 认证开发流程(重点)
  • drf-jwt 框架基本使用
  • token 刷新机制(了解)

jwt 优势

1 没有数据库写操作,高效

2 服务器不存 token,低耗

3 签发检验都是算法,集群

jwt 认证

jwt 认证

jwt 认证

jwt 认证



jwt 认证算法:签发与检验

  1. jwt 三段式:头 . 体 . 签名 (head.payload.sgin)

  2. 头和体是可逆加密,让服务器可以反解除 user 对象,签名是不可逆加密,保证整个token的安全性的

  3. 头体签名三部分,都是采用 json 格式的字符串,进行加密,可逆加密一般采用 base64 算法,不可逆加密一般采用 hash(md5) 算法

  4. 头中的内容是基本信息:公司信息,项目组信息,token 采用的加密方式信息

    {
    	"company": "公司信息",
    	...
    }
    
  5. 体中的内容是关键信息:用户主键,用户名,签发是客户端信息(设备号,地址),过期时间

    {
    	"user_id": 1,
    	...
    }
    
  6. 签名中的内容是安全信息:头的加密结果 + 体的加密结果 + 服务器不对外公开的安全吗 进行 md5 加密

    {
    	"head": "头的加密字符串",
    	"payload": "体的加密字符串",
    	"secret_key": "安全码"
    }
    

签发

根据登陆请求提交来的 账号 + 密码 + 设备信息 签发 token

  1. 用基本信息存储 json 字典,采用 base64 算法加密得到 头字符串
  2. 用关键信息存储 json 字典,采用 base64 算法加密得到 体字符串
  3. 用头、体加密字符串再加安全码信息存储 json 字典,采用 hash md5 算法加密得到 签名字符串

校验

根据客户端带 token 的请求,反解除 user 对象

  1. 将 token按“ . ”拆分为三段字符串,第一段头加密字符串,一般不需要做任何处理
  2. 第二段体加密字符串,要反解出用户主键,通过主键从 User 表中就能得到登陆用户,过期时间和设备信息都是安全信息,确保 token 没过期,且是同一设备来的
  3. 再用 第一段 + 第二段 + 服务器安全吗 不可逆 md5 加密,与第三段字符串进行碰撞校验,通过后才能代表第二段校验得到的 user 对象就是合法的登陆用户

drf 项目的 jwt 认证开发流程(重点)

  1. 用账号密码访问登陆接口,登陆接口逻辑中调用 签发 token 算法,得到 token,返回给客户端,客户端自己存到 COOKIEs 中
  2. 校验 token 的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会校验,所以请求带来了 token,就会反解出 user 对象,在视图类中用 request.user 就能访问登陆的用户

注意:登陆接口需要做 认证 + 权限 两个局部禁用



drf-jwt 框架基本使用

安装

pip install djangorestframework-jwt

签发 token(登陆接口):视图类已经写好了,配置一下路由就行(urls.py)

# api/urls.py
from rest_framework_jwt.views import ObtainJSONWebToken
urlpatterns = [
    # ...
    url('^login/$', ObtainJSONWebToken.as_view()),
]

# Postman请求:/api/login/,提供username和password即可

校验 token (认证组件):认证类已经写好了,全局配置一下组件就行了(settings.py)

# drf-jwt的配置
import datetime
JWT_AUTH = {
    # 配置过期时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}


# drf配置(把配置放在最下方)
REST_FRAMEWORK = {
    # 自定义三大认证配置类们
    'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
    # 'DEFAULT_PERMISSION_CLASSES': [],
    # 'DEFAULT_THROTTLE_CLASSES': [],
}

设置需要登陆才能访问的接口进行测试(views.py)

from rest_framework.permissions import IsAuthenticated
class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin):
    # 设置必须登录才能访问的权限类
    permission_classes = [IsAuthenticated, ]

    queryset = models.User.objects.filter(is_active=True).all()
    serializer_class = serializers.UserCenterSerializer

测试访问登陆认证接口(Postman)

"""
1)用 {"username": "你的用户", "password": "你的密码"} 访问 /api/login/ 接口等到 token 字符串

2)在请求头用 Authorization 携带 "jwt 登录得到的token" 访问 /api/user/center/1/ 接口访问个人中心
"""


token 刷新机制(了解)

drf-jwt 直接提供刷新功能

"""
1)运用在像12306这样极少数安全性要求高的网站
2)第一个token由登录签发
3)之后的所有正常逻辑,都需要发送两次请求,第一次是刷新token的请求,第二次是正常逻辑的请求
"""

settings.py

import datetime

JWT_AUTH = {
    # 配置过期时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=5),

    # 是否可刷新
    'JWT_ALLOW_REFRESH': True,
    # 刷新过期时间
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

urls.py

from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
urlpatterns = [
    url('^login/$', ObtainJSONWebToken.as_view()),  # 登录签发token接口
    url('^refresh/$', RefreshJSONWebToken.as_view()),  # 刷新toekn接口
]

postman

# 接口:/api/refresh/
# 方法:post
# 数据:{"token": "登录签发的token"}

推荐阅读
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 在Spring与Ibatis集成的环境中,通过Spring AOP配置事务管理至服务层。当在一个服务方法中引入自定义多线程时,发现事务管理功能失效。若不使用多线程,事务管理则能正常工作。本文深入分析了这一现象背后的潜在风险,并探讨了可能的解决方案,以确保事务一致性和线程安全。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 本文针对Bugku平台上的“MD5碰撞”挑战进行详细解析。该挑战要求参赛者通过分析MD5哈希函数的碰撞特性,解决页面提示的输入问题。文章首先介绍了靶场链接和题目背景,随后详细描述了解题思路和步骤,包括如何利用已知的MD5碰撞实例来绕过验证机制,最终成功完成挑战。通过本分析,读者可以深入了解MD5算法的安全缺陷及其在实际应用中的潜在风险。 ... [详细]
author-avatar
小帅哥骑小猪撞墙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有