广告位联系
返回顶部
分享到

JWT的原理及使用

python 来源:互联网 作者:佚名 发布时间:2023-02-20 22:41:26 人浏览
摘要

目录JWT的原理及使用一、什么是JWT?二、签发认证流程三、使用方法1.设置登录接口2.设置过期事件3.定制返回格式4.配置认证类和权限类5.写登录逻辑5.配路由JWT的原理及使用一、什么是

目录

  • JWT的原理及使用
    • 一、什么是JWT?
    • 二、签发认证流程
    • 三、使用方法
      • 1.设置登录接口
      • 2.设置过期事件
      • 3.定制返回格式
      • 4.配置认证类和权限类
      • 5.写登录逻辑
      • 5.配路由

 

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返回给浏览器,让浏览器进行保存。
image
访问其他接口时,浏览器将token发往服务端,再次将header和payload按相同的加密方式和秘钥加密,得到的签名与token第三段(也就是第一次的签名)比对,比对成功则认证成功。
image

三、使用方法

# 第三方模块要在终端下载
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)),
]

版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 :
相关文章
  • numpy.unique()使用方法介绍
    numpy.unique() 函数接受一个数组,去除其中重复元素,并按元素由小到大返回一个新的无元素重复的元组或者列表。 1. 参数说明 1 numpy.unique
  • JWT的原理及使用
    目录JWT的原理及使用一、什么是JWT?二、签发认证流程三、使用方法1.设置登录接口2.设置过期事件3.定制返回格式4.配置认证类和权限类5.写
  • NumPy迭代数组的实现的介绍
    NumPy中引入了 nditer 对象来提供一种对于数组元素的访问方式。 一、单数组迭代 1. 使用 nditer 访问数组的每个元素 1 2 3 4 5 6 7 8 9 10 11 12 13 1
  • python批量翻译excel表格中的英文
    需求背景 女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。 主要设计 读取一个表格文件,获取需要翻译的文本 使用百度翻译
  • python中数字列表转化为数字字符串的代码

    python中数字列表转化为数字字符串的代码
    1. python中数字组成的列表转化为字符串或者一串数字 1 2 3 4 5 6 7 8 f=[1,2,3,4] num=len(f) m= #建立空字符串 for i in range(num): x=str(f[i]) m=m+x #利用字符
  • pandas中groupby操作实现介绍

    pandas中groupby操作实现介绍
    一、实验目的 熟练掌握pandas中的groupby操作 二、实验原理 groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False) 参数说明
  • Python正则表达式中group与groups的用法介绍

    Python正则表达式中group与groups的用法介绍
    在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息。 group方法是re.MatchObject类中的一个函数,用于返
  • Sklearn调优之网格搜索与随机搜索原理介绍
    前言 超参调优是模型调优(Model Tuning)阶段最主要的工作,是直接影响模型最终效果的关键步骤,然而,超参调优本身却是一项非常低级且枯
  • Flask接口签名sign原理与实例代码
    作用 防止有人不停的刷接口,对接口作限制 比如说,登录接口,按道理说,应该只有app会请求这个接口 但是,如果有人抓取app的请求,就
  • Python机器学习利用鸢尾花数据绘制ROC和AUC曲线

    Python机器学习利用鸢尾花数据绘制ROC和AUC曲线
    一、ROC与AUC 很多学习器是为了测试样本产生的一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计