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. EF to Sqlite

    测试下来,使用到下面的版本: EF6.1 System.Data.SQLite.EF6.1.0.93.0 System.Data.SQLite.Core.1.0.93.0  注意事项: 设置Autoi ...

  2. c# 接口的协变和逆变

    如果派生类只是用于输出值,那么这种结构化的委托有效性之间的常数关系叫做协变 就是创建一个派生类委托对象 让派生类赋值给基类对象 协变关键字out 对期望传入基类时允许传入派生对象的特性叫逆变  逆变关 ...

  3. 【译】《Clean C#》

    本文是<Clean C#>一书译文的序言,阅读译文请移步至:<Clean C#>译文. <Clean C#>的副标题是Readable,Maintainable,P ...

  4. Log4j的扩展RollingFileAppender、DailyRollingFileAppender

    最常用的Appender--RollingFileAppender RollingFileAppender的一个Log4j配置样例: log4j.appender.R=org.apache.log4j ...

  5. Reactor模式理解

    Reactor模式 也可以叫反应器模式或者应答者模式 reactor模式简介 让我们先了解一下阻塞I/O与非阻塞I/O I/O 是非常缓慢的 I/O绝对是计算机操作中最慢的.访问RAM的事件为ns级别 ...

  6. tomcat中 server.xml

    tomcat服务器, 配置文件server.xml中的各项配置的意义 <?xml version="1.0" encoding="UTF-8"?> ...

  7. Puppeteer之爬虫入门

    译者按: 本文通过简单的例子介绍如何使用Puppeteer来爬取网页数据,特别是用谷歌开发者工具获取元素选择器值得学习. 原文: A Guide to Automating & Scrapin ...

  8. EF中更新操作 ID自增但不是主键 ;根据ViewModel更新实体的部分属性

    //ID自增但不是主键的情况 public int Update_join<TEntity>(TEntity entity) where TEntity : class { dbconte ...

  9. JS预解析机制

    JS的预解析过程: 1,预解析 2,再逐行解读代码, 实例: ---------------------------- <script>        var name="xm& ...

  10. #WEB安全基础:HTML/CSS | 0x0 我的第一个网页

    #WEB安全基础:HTML/CSS系列,本系列采用第二人称以免你不知道我在对着你说话,以朋友的视角和你交流 HTML的中文名叫做超文本标记语言,CSS叫做层叠样式表 用HTML设计你的第一个网页,你需 ...