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. Tesseract 引擎翻译

    Tesseract 引擎翻译 Category: 图像识别 Last Edited: Sep 17, 2018 10:29 AM Tags: tesseract,字符识别,翻译 1.英文原文(中文翻译 ...

  2. mysql使用存储过程&函数实现批量插入

    写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: cre ...

  3. Linux-cut命令(22)

    cut剪切命令cut命令通常用来对某个文本文件进行解析,擅长处理以一个字符间隔的文本内容 -b :以字节(bytes)为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c ...

  4. python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  5. Ubuntu创建新用户的正确姿势

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...

  6. 详解bootstrap-fileinput文件上传控件的亲身实践

    经理让我帮服务器开发人员开发一个上传文件功能界面,我就想着以前使用过bootstrap-fileinput插件进行文件上传,很不错.赶紧就撸起来了. 1.下载压缩包.插件地址https://githu ...

  7. gulp es6 转 es5

    npm install --save-dev gulp-babel babel-preset-es2015 var babel = require("gulp-babel"); / ...

  8. BUG -Failed to compile.

    检查代码发现: 图片的路径写错了 改回正确路径页面可以正常显示

  9. Android为TV端助力 最详细的动画大全,包括如何在代码和在XML中使用

    一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...

  10. SpringBoot集成Swagger接口管理工具

    手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时. 接口返回结果不明确 不能直接在线测试接口,通常需要使用工具,比如postman 接口文档太多,不好管 ...