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. 搜索与图论篇——DFS和BFS

    搜索与图论篇--DFS和BFS 本次我们介绍搜索与图论篇中DFS和BFS,我们会从下面几个角度来介绍: DFS和BFS简介 DFS数字排序 DFS皇后排序 DFS树的重心 BFS走迷宫 BFS八数码 ...

  2. 高效率开发Web安全扫描器之路(一)

    一.背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖 ...

  3. elasticsearch 聚合之 date_histogram 聚合

    目录 1.背景 2.bucket_key如何计算 3.前置知识 4.日历和固定时间间隔 4.1 Calendar intervals 日历间隔 4.2 Fixed intervals 固定间隔 5.数 ...

  4. 使用Spring Reactor优化推荐流程

    1. 背景 公司有一个推荐系统Rec,这个系统的主要功能是: 向外部系统提供推荐接口 根据请求获取推荐策略 根据推荐策略完成推荐的召回.过滤.打分.排序阶段 Rec作为微服务中的一环,本身不存储召回的 ...

  5. 如何基于 Redis 实现分布式锁

    什么是分布式锁 分布式锁:不同进程必须以互斥方式使用共享资源的一种锁方法实现. 实现分布式锁的基础 互斥.任何时刻,只有一个客户端持有锁. 无死锁.最终总是有可能获得锁,即使持有锁的客户端已经崩溃. ...

  6. Jgit的使用笔记

    原文:Jgit的使用笔记 - Stars-One的杂货小窝 之前整的一个系统,涉及到git代码的推送,是通过cmd命令去推送的,然后最近在产品验收的时候,测试部门随意填了个git仓库,然后导致仓库代码 ...

  7. 网络工具netstat与ss

    建议使用ss命令,2001年的时候netstat 1.42版本之后就没更新了,之后取代的工具是ss.netstat命令在很多场景下比较慢.ss可以显示跟netstat类似的信息,但是速度却比netst ...

  8. Django框架:8、聚合查询、分组查询、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数

    Django 数据库 目录 Django 数据库 一.聚合查询 二.分组查询 三.F查询与Q查询 1.F查询 2.Q查询 3.Q查询进阶操作 四.ORM查询优化 1.only与defer 五.ORM事 ...

  9. Jmeter之逻辑控制器---while控制器

    while控制器与编程语言中的while语句一样,当条件为真时继续执行,不为真时则跳出while循环体,不再执行. while控制器相对于循环控制器来说多了个条件判断,下面为while控制器使用案例. ...

  10. dfs学习笔记

    题目链接 可以通过参考一道例题来加深对dfs的认知和学习 题意描述 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数 字序列中不允许出现重复的数字. 输出格式 ...