jwt 认证

私钥、公钥、CA认证

用一套加密规则 加密和解密

RSA加密 (非对称的加密)

摘要算法:MD5 FTP/互联网下载软件校验MD5

私钥 --RSA算法-->公钥

RSA原理

加密解密:只要你有我的公钥你就能知道我发的消息是什么。

数字签名:只要用我的公钥把一个消息解密了,那么这个消息就一定是我发的。

小故事:公钥、私钥、CA认证阅读

组成:

  • 村长博客: www.cnblogs.com/leguan1314

  • header.payload.sign ==>> 头部.载荷.签名

  • 依赖包:

    • import hmac

      import time

      import json

      import base64

      import hashlib

      import jwt

头部:

  • 就是一个 字典 包含了 typ: token 类型 alg: 签名算法
headers = {
# 申明token类型 `type`
"typ": "JWT",
# 声明你的签名算法
"alg": "HS256"
} # 头部被 `base64` 编码
header_string = base64.urlsafe_b64encode(json.dumps(headers).encode("utf-8")).replace(b'=', b'')
# 载荷(用户信息)

载荷:

  • 用户信息
payload = {
# TODO 公传参数
# 签发者
"iss": "liuzhichao",
# 什么时候给的会话凭证
"iat": int(time.time()),
# 过期时间(什么时候过期)
"exp": int(time.time()) + 100,
# 接收 `jwt` 的一方
"aud": "luffy",
# TODO 自定义参数
# 用户名
"username": "XXX",
# 用户ID
"user_id": "101"
} # 载荷被 `base64` 编码
payload_string = base64.urlsafe_b64encode(json.dumps(payload).encode("utf-8")).replace(b'=', b'')

签名:

  • 一个 加密的字符串
# 签名
# 用于加密的 字符串
secret = "+&0p1d$l$lq%xm0qvet0i++!p-*e1ql*5t!kajgjm$fe_ycf1n" sign_data = "{}.{}".format(header_string.decode("utf-8"), payload_string.decode("utf-8")).encode("utf-8") sign = base64.urlsafe_b64encode(hmac.new(secret.encode("utf-8"),sign_data,hashlib.sha256).digest())

将三部分用点拼接 生成

print("{}.{}.{}".format(
header_string.decode("utf-8"),
payload_string.decode("utf-8"),
sign.decode("utf-8"),
))

效验 jwt:

from rest_framework import authentication

class JwtAuthentication(authentication.BaseAuthentication):

    def authenticate(self, request):
jwt = request.META.get("HTTP_AUTHORIZATION") # 校验 `jwt` 是否合法
# 获取到 `token`
jwt = jwt.encode("utf-8") # 分割 `jwt`
header_payload_string, sign_string = jwt.rsplit(b'.', 1)
header_string, payload_string = header_payload_string.split(b'.', 1) header_data = base64.urlsafe_b64decode(header_string)
# 获取到头部数据
header = json.loads(header_data.decode("utf-8"))
# 获取到载荷数据
payload = base64.urlsafe_b64decode(payload_string)
# 获取到签名
signature = base64.urlsafe_b64decode(sign_string) # 获取到签名算法
alg = header.get('alg') if not alg:
print("没有算法")
raise ValueError("alg is not null") secret = "+&0p1d$l$lq%xm0qvet0i++!p-*e1ql*5t!kajgjm$fe_ycf1n".encode("utf-8") if not hmac.compare_digest(
signature, hmac.new(secret, header_payload_string, hashlib.sha256).digest()
):
print("验证失败")
raise ValueError("验证签名失败") print("验证通过")
payload_dic = json.loads(payload.decode("utf-8"))
print(payload_dic) # 过期时间校验
if not payload_dic.get("exp") > int(time.time()):
raise ValueError("jwt过期了") from django.contrib.auth.models import User return User.objects.get(pk=payload_dic.get("user_id")), None

直接用模块 生成 jwt:

# 用模块生成
# 秘钥
secret = "+&0p1d$l$lq%xm0qvet0i++!p-*e1ql*5t!kajgjm$fe_ycf1n" expire_time = int(time.time() + 1) # 1 小时后超时
# 生成 gwt
encoded = jwt.encode(
# header 密钥 编码方式
{'id': 4294967296, 'exp': expire_time}, secret.encode("utf8"), algorithm='HS256') encoded_str = str(encoded, encoding='utf-8')
print(encoded_str) time.sleep(2)
# 解码
info = jwt.decode(encoded_str, secret, algorithm='HS256')
print(info)

也可以 使用 django 自带的 jwt

  • pip install djangorestframework-jwt

其他点:

  • 注册 rest_framework app 设置 ALLOWED_HOSTS = ["*"] 为所有

  • 在 serializer 序列化器 中 的 validata(self, data) 函数中 获取 request 对象

    并在对象中 获取 请求头 也就是 jwt 的 字符串

    def validata(self, data):
    # 获取 request 对象
    request = self.context.get('request')
    # 获取请求头 也就是 jwt
    jwt = request.META.get('HTTP_AUTHORIZATION')

JWT 认证 以及Django 中的应用的更多相关文章

  1. ASP.Net Core 3.0 中使用JWT认证

    JWT认证简单介绍     关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构.     JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包 ...

  2. 频率类组件-认证规图分析-JWT认证-drf-jwt插件

    频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...

  3. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

  4. Django REST framework 之JWT认证

    Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...

  5. DRF JWT的用法 & Django的自定义认证类 & DRF 缓存

    JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...

  6. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  7. Django(65)jwt认证原理

    前言 带着问题学习是最有目的性的,我们先提出以下几个问题,看看通过这篇博客的讲解,能解决问题吗? 什么是JWT? 为什么要用JWT?它有什么优势? JWT的认证流程是怎样的? JWT的工作原理? 我们 ...

  8. Django 中的用户认证

    Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...

  9. sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

随机推荐

  1. 从零开始学安全(十一)●IP地址

    127 都是本机地址 ip  DE 类网段 都是广播网段 它并不指向特定的网络 用不上

  2. python基础学习(六)函数基础

    函数的基本使用 函数的定义 def 函数名(): 函数封装的代码 …… def 是英文 define 的缩写 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用 函数名称 的命名应该 符合 ...

  3. Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二

    Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  4. 异常: Bean named 'org.springframework.transaction.interceptor.TransactionInterceptor#0' is expected to be of type 'org.aopalliance.aop.Advice' but was actually of type 'org.springframework.transaction.i

    场景: 在使用spring整合hibernate事务时报错解决: spring-aop中已经包含aopaliance,删除多余的jar包

  5. 为啥JQuery被淘汰了?

    摘要: 技术进步永不止步. 原文:jQuery的没落和技术发展的一般规律 作者:凌霄光 Fundebug经授权转载,版权归原作者所有. jQuery的成就 jQuery是一个伟大的库, 它解决了dom ...

  6. Android图片的Base64编码与解码

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较 ...

  7. Elasticsearch Query DSL

    Elasticsearch Query DSL By:授客 QQ:1033553122 1. match_all 1 2. match 2 3. match_phrase 5 4. match_phr ...

  8. Java map 详解

    Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值. 初始化一个集合:  Map<String, String> map = ...

  9. hdu-2027题&&gets/getchar的区别

    hdu-2027题(水题~~~) 统计每个元音字母在字符串中出现的次数. Input输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串. Output对于每个测试实例输 ...

  10. [Java]Socket和ServerSocket学习笔记

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...