JWT的原理及使用

一、什么是JWT?

​ Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。原本通过客户端cookie和服务端session各存一个随机字符串的方式对服务端的存储压力很大,于是token应运而生,它只要求客户端存储一串加密字段,而不需要服务端存储。

JWT由三部分组成的

  1. header头 用于声明类型,声明加密算法等,甚至会添加公司信息
  2. payload荷载 存放有效信息的地方,过期时间、签发时间、用户id等
  3. 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的原理及使用的更多相关文章

  1. JSON Web Token(JWT)原理和用法介绍

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.今天给大家介绍一下JWT的原理和用法. 官网地址:https://jwt.io/ 一.跨域身份验证 Internet服务无法与 ...

  2. jwt的原理以及使用

    jwt原理(json web token) 我们之前是使用session实现登录,通过实际密码+盐组成字符串进行md5存入redis或者数据库中,输入的密码与实际校验通过,发送给客户端一个有效时间的t ...

  3. JWT认证原理及使用

    一.JWT原理: 参考文章:https://www.jianshu.com/p/180a870a308a 1.传统的登录方式: 浏览器输入用户名密码,服务端校验通过,根据用户信息生成一个token,将 ...

  4. 什么是JWT?原理是什么?

    什么是JWT JWT 是Json Web Tokens的简称.用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的.用于在网络上声明某种主张的令牌(token). JTW原理 jwt验 ...

  5. Django(65)jwt认证原理

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

  6. JWT(JSON Web Token)原理简介

    原文:http://www.fengchang.cc/post/114 参考了一下这篇文章:https://medium.com/vandium-software/5-easy-steps-to-un ...

  7. 深入浅出JWT(JSON Web Token )

    1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行 ...

  8. 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 ...

  9. ASP.NET Core的JWT的实现(中间件).md

    既然选择了远方,便只顾风雨兼程 __ HANS许 JWT(JSON Web Token) ASP.NET Core 的Middleware实现 引言:挺久没更新了,之前做了Vue的系列,后面想做做服务 ...

  10. 10分钟了解JSON Web令牌(JWT)

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.虫虫今天给大家介绍JWT的原理和用法. 1.跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 1.用户 ...

随机推荐

  1. 群晖NAS搭建外网可访问的calibre

    一.在群晖docker上安装calibre-web 1. 下载相关的镜像文件 打开Docker后点击左侧注册表,在上方搜索栏搜索calibre 然后我们选择使用 technosoft2000/cali ...

  2. 写一个frida通杀脚本

    1. 前言 过年对我来说和平常没什么区别,该干什么干什么. 之前没接触过 frida 这个工具,前几天用了一些时间学习了一下,相比于 xposed hook 框架,frida 相对于调试方面真的很方便 ...

  3. 关于仿照js写python算法

    前言 我们学校的统一认证的登录系统,用了一套不知道哪弄来的 js加密算法 (我已经查到了,应该是出自这里 地址),有一个参数是通过 js 计算得到的,无奈我先想模拟登录就必须解决这个算法,这个说明是d ...

  4. 如何使用OpenCV+MMPEAG打开摄像头,显示的同时推送RTMP流。

    注意,设置中: 代码详解: 1. char* outUrl = "rtmp://localhost/live/livestream"; 这个地址,是AMS(Adeobe Media ...

  5. python安装过程

    1.在官网下载,点击进入安装包. 2.把Add勾上,会自动配置环境变量. 3,这些是要下载的东西,要全部勾上. 4.这里特别注意路径,把路径改成自己想放的盘里面. 5.配置环境变量,在此电脑搜索 编辑 ...

  6. 7、解决swagger测试接口报错:TypeError: Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body

    一.Swagger报错: 1.报错类型: TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method ...

  7. [编程基础] C++多线程入门8-从线程返回值

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 8 从线程返回值 8 ...

  8. tempdb数据文件暴增分析

    背景 某客户tempdb数据文件突然暴增,导致磁盘可用空间紧张,让我们找到暴增的原因. 现象 登录到SQL专家云,通过趋势分析进行回溯,在4月12日,tempdb数据文件在3个小时内从10GB涨到了8 ...

  9. 【Java】线程池梳理

    [Java]线程池梳理 前言 线程池:本质上是一种对象池,用于管理线程资源.在任务执行前,需要从线程池中拿出线程来执行.在任务执行完成之后,需要把线程放回线程池.通过线程的这种反复利用机制,可以有效地 ...

  10. Coolify系列-解决WARNING: IPv4 forwarding is disabled. Networking will not work.以及开启防火墙端口

    背景 我在windows电脑安装了一个VM,使用VM开启了Linux服务器,运行docker,然后遇到了这个报错. 解决 首先:在宿主机上执行 echo "net.ipv4.ip_forwa ...