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. Postman Post请求上传文件

    Postman Post请求上传文件一.选择post请求方式,输入请求地址 二.填写Headers Key:Content-Type :Value:multipart/form-data 如下图 三. ...

  2. C-Linux_毫秒级随机值获取

    秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...

  3. Laravel篇之Laravel的安装及使用

      想搭建一个基于Lavarel和vuejs的个人网站,使用git推送到github存储,千里之行,始于足下,首先要做的用composer来下载laravel框架,并成功运行. 一.使用compose ...

  4. GA中的术语及经常分析的指标

    GA中的术语 跳出客流:只浏览了网站的一个页面,并且没有进一步动作的访客目标转化:通常缩写为目标或转化,这是网站上面的一个预期或动作,通常被认为比标准网页更有价值,例如:"确认购买" ...

  5. How To Do Master Record Mass Maintenance

    How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...

  6. Redis 保护模式

    默认 redis 启用了保护模式,即如果是远程链接不能进行 CRUD 等操作,如果进行该操作报错如下 (error) DENIED Redis is running in protected mode ...

  7. MySql数据库实现分布式的主从结构

    最近学习了关于使用MySql数据的实现主动结构的原理,在以前的并发访问低的场景一下,一般一台性能高的服务器作为一个MySql数据,就可以满足业务的增删改查场景,但是随着网络用户的增加 当出现高并发,高 ...

  8. matlab练习程序(波纹扭曲)

    其实就是用sin或cos对x,y坐标进行变换,处理的时候依然是反向变换. 类似的,用不同的函数能得到不同的扭曲效果,比如log,1/x,exp等等. 效果如下: 代码如下(还给出了如何生成gif图片的 ...

  9. JAVA多线程的问题以及处理(二)【转】

    使用互斥解决多线程问题是一种简单有效的解决办法,但是由于该方法比较简单,所以只能解决一些基本的问题,对于复杂的问题就无法解决了. 解 决多线程问题的另外一种思路是同步.同步是另外一种解决问题的思路,结 ...

  10. Spring入门详细教程(一)

    一.spring概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的 ...