JWT的原理及使用
JWT的原理及使用
一、什么是JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。原本通过客户端cookie和服务端session各存一个随机字符串的方式对服务端的存储压力很大,于是token应运而生,它只要求客户端存储一串加密字段,而不需要服务端存储。
JWT由三部分组成的
- header头 用于声明类型,声明加密算法等,甚至会添加公司信息
- payload荷载 存放有效信息的地方,过期时间、签发时间、用户id等
- signature签名 是通过前两个部分通过秘钥+加密的方式得到的
整体以.隔开的三段密文,而密文的加密方式一般是base64
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
而base64是可以解码的一种编码格式,base编码常用于网络运输,让数据看起来像密文,一般人就不去尝试解密了。因为base64是对二进制进行加密,所以照片数据等也都可以用base64加密传输*它加密的结果一定是4的倍数,当倍数不足时,用等号补齐即可下面是简单使用方法
import base64
import json
# base64编码
payload = {'user_id': 1, 'exp': 1234567890}
dic_str = json.dumps(payload) # 将字典转为字符串
enc_payload = base64.b64encode(dic_str.encode('utf-8')) # 二进制加密
print(enc_payload)
# base64解密
print(base64.b64decode('base64的密文')) # 是不是二进制都可以
二、签发认证流程
访问登录接口时,发送header和payload的数据,然后在服务端使用加密算法和秘钥进行签名,生成token,然后响应时将token返回给浏览器,让浏览器进行保存。

访问其他接口时,浏览器将token发往服务端,再次将header和payload按相同的加密方式和秘钥加密,得到的签名与token第三段(也就是第一次的签名)比对,比对成功则认证成功。

三、使用方法
# 第三方模块要在终端下载
pip3.8 install djangorestframework-jwt -i https://pypi.douban.com/simple
1.设置登录接口
# 这样配置个路由即可,基于Django原生的auth_user表去封装登录接口
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]
2.设置过期事件
# 在配置文件里配置过期时间
import datetime
JWT_AUTH = {
# 过期时间1天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 如果不自定义,返回的格式是固定的,只有token字段
'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
}
3.定制返回格式
# 如果想要定制返回格式,让它不止有token字段,可以重写jwt_response_payload_handler,然后直接配置到字典中即可
# 在app01下新建一个utils.py文件写函数 写上该方法即可,不用导入什么的
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code': 100,
'msg': '登录成功',
'token': token,
'username': user.username
}
4.配置认证类和权限类
# JWT要跟登录认证和权限类配个使用,这俩认证类没有传token值时直接让通过,这样逻辑岂不是很尴尬嘛
# 当然得写认证类和权限类
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated]
5.写登录逻辑
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.viewsets import ViewSet
from django.contrib.auth.models import User
class LoginView(ViewSet):
# 这里要配认证类和权限类
@action(methods=['POST'], detail=False)
def login(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = User.objects.filter(username=username, password=password).first()
if user:
return Response({'code': '100', 'msg': '登录成功'})
else:
return Response({'code': '101', 'msg': '用户名或密码错误'})
5.配路由
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import SimpleRouter
from app01 import views
router = SimpleRouter()
router.register('login', views.LoginView, 'login')
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
path('admin/', admin.site.urls),
path('api/v1/', include(router.urls)),
]
JWT的原理及使用的更多相关文章
- JSON Web Token(JWT)原理和用法介绍
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.今天给大家介绍一下JWT的原理和用法. 官网地址:https://jwt.io/ 一.跨域身份验证 Internet服务无法与 ...
- jwt的原理以及使用
jwt原理(json web token) 我们之前是使用session实现登录,通过实际密码+盐组成字符串进行md5存入redis或者数据库中,输入的密码与实际校验通过,发送给客户端一个有效时间的t ...
- JWT认证原理及使用
一.JWT原理: 参考文章:https://www.jianshu.com/p/180a870a308a 1.传统的登录方式: 浏览器输入用户名密码,服务端校验通过,根据用户信息生成一个token,将 ...
- 什么是JWT?原理是什么?
什么是JWT JWT 是Json Web Tokens的简称.用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的.用于在网络上声明某种主张的令牌(token). JTW原理 jwt验 ...
- Django(65)jwt认证原理
前言 带着问题学习是最有目的性的,我们先提出以下几个问题,看看通过这篇博客的讲解,能解决问题吗? 什么是JWT? 为什么要用JWT?它有什么优势? JWT的认证流程是怎样的? JWT的工作原理? 我们 ...
- JWT(JSON Web Token)原理简介
原文:http://www.fengchang.cc/post/114 参考了一下这篇文章:https://medium.com/vandium-software/5-easy-steps-to-un ...
- 深入浅出JWT(JSON Web Token )
1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行 ...
- Java JWT: JSON Web Token
Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...
- ASP.NET Core的JWT的实现(中间件).md
既然选择了远方,便只顾风雨兼程 __ HANS许 JWT(JSON Web Token) ASP.NET Core 的Middleware实现 引言:挺久没更新了,之前做了Vue的系列,后面想做做服务 ...
- 10分钟了解JSON Web令牌(JWT)
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.虫虫今天给大家介绍JWT的原理和用法. 1.跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 1.用户 ...
随机推荐
- vscode,java中文乱码
1.vscode默认是utf-8,但最好再打开自动检测 2.在vscode设置里搜 auto guess,启用auto guess encoding 3.windows默认的是gbk,在windows ...
- 【每日一题】【栈】2022年2月2日-NC40 两个链表生成相加链表
描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 答案:栈 import java.util.*; /* ...
- Django框架:1、手撸web框架、Django框架简介、安装与使用和小白必会三板斧
Django框架 目录 Django框架 一.Django推导流程 1.纯手撸web框架 2.基于wsgire模块 3.代码封装优化 4.动静态网页 5.jinja2模块 6.前端.后端.数据库三者联 ...
- uniapp安装和使用
工具安装 开发uni-app需要安装HBuilder X. 下载地址:https://www.dcloud.io/hbuilderx.html. 下载成功后直接解压即可 创建第一个uni-app 点击 ...
- 体验一个前端视图层的mvvm的框架Knockoutjs(双向绑定,模板..)..解放您的双手,不再处理那么多的dom操作..快速实现视图层数据与UI的交互处理
笔者之前对于类似前端展示的,可能都是自己开发js对象,集合外加dom事件进行处理.. 近期看到相关资料,了解了Knockoutjs这个框架,下面来段代码: <script type=" ...
- [OpenCV实战]7 使用YOLOv3和OpenCV进行基于深度学习的目标检测
目录 1 YOLO介绍 1.1 YOLOv3原理 1.2 为什么要将OpenCV用于YOLO? 1.3 在Darknet和OpenCV上对YOLOv3进行速度测试 2 使用YOLOv3进行对象检测(C ...
- vulnhub靶场之FUNBOX: UNDER CONSTRUCTION!
准备: 攻击机:虚拟机kali.本机win10. 靶机:Funbox: Under Construction!,下载地址:https://download.vulnhub.com/funbox/Fun ...
- 【译】15 个有用的 JavaScript 技巧
原文地址:https://javascript.plainenglish.io/15-useful-javascript-tips-814eeba1f4fd 1)数字分隔符 为了提高数字的可读性,可以 ...
- Axure 环境进度条
步骤一:拖拉摆放好相关控件 1.4个半圆环,一个白色上半圆环 (上白),一个白色下半圆环 (下白),一个灰色上半圆环 (上灰),一个灰色下半圆环 (下灰),排放层次为: 下灰<下白<上灰& ...
- 从0到1手把手实现vite
什么是Vite? 法语:轻量化,快速 基于VUE3 非 打包开发服务器,请注意,它是个开发服务器哇!! 快速开发,按需编译,不再等待整个应用编译完成 基于原生模块系统ESModule实现 说白了,就是 ...