一简介

JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。

JWT的组成部分:

header

Header是由下面这个格式的Json通过Base64编码(编码不是加密,是可以通过反编码的方式获取到这个原来的Json,所以JWT中存放的一般是不敏感的信息)生成的字符串,Header中存放的内容是说明编码对象是一个JWT以及使用“SHA-256”的算法进行加密(加密用于生成Signature)

playload

Payload是通过Claim进行Base64转码之后生成的一串字符串,Claim是一个Json,Claim中存放的内容是JWT自身的标准属性,所有的标准属性都是可选的,可以自行添加,比如:JWT的签发者、JWT的接收者、JWT的持续时间等;同时Claim中也可以存放一些自定义的属性,这个自定义的属性就是在用户认证中用于标明用户身份的一个属性,比如用户存放在数据库中的id,为了安全起见,一般不会将用户名及密码这类敏感的信息存放在Claim中。将Claim通过Base64转码之后生成的一串字符串称作Payload

signatrue

Signature是由Header和Payload组合而成,将Header和Claim这两个Json分别使用Base64方式进行编码,生成字符串Header和Payload,然后将Header和Payload以Header.Payload的格式组合在一起形成一个字符串,然后使用上面定义好的加密算法和一个密匙(这个密匙存放在服务器上,用于进行验证)对这个字符串进行加密,形成一个新的字符串,这个字符串就是Signature

签名的目的:最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改。如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。

rest_framework_jwt

rest_framework_jwt是一个封装了jwt符合restful规范的接口

网站地址:http://getblimp.github.io/django-rest-framework-jwt/

安装:pip install djangorestframework-jwt

二、配合drf的认证组件的使用方法

配置文件

#添加rest-framework
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config',"rest_framework",
]REST_FRAMEWORK = {# 配置默认的认证方式 base:账号密码验证#session:session_id认证'DEFAULT_AUTHENTICATION_CLASSES': (# drf的这一阶段主要是做验证,middleware的auth主要是设置session和user到request对象# 默认的验证是按照验证列表从上到下的验证'rest_framework.authentication.BasicAuthentication','rest_framework.authentication.SessionAuthentication',"rest_framework_jwt.authentication.JSONWebTokenAuthentication",)}import datetime# 超时时间
JWT_AUTH = {'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),# token前缀'JWT_AUTH_HEADER_PREFIX': 'JWT',
}# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app01.User"

模型表

#使用django自带的auth组件模型表
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):phone=models.CharField(max_length=11,null=True)

url路由层

from django.conf.urls import url
from django.contrib import admin
from rest_framework_jwt.views import obtain_jwt_token
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),# url(r'^home/',  views.Home.as_view()),# 登入验证,使用JWT的模块,只要用户密码正确会自动生成一个token返回url(r'^login/', obtain_jwt_token),# 访问需要认证的接口url(r'^index/', views.Index.as_view()),
]

view视图层

from django.shortcuts import render
from django.http import JsonResponse# Create your views here.
from rest_framework.views import APIView
from app01.jwtMiddleware import TokenAuthclass Index(APIView):  #局部认证的配置authentication_classes = [TokenAuth,]def get(self,request):return JsonResponse({"index":"ok"})
class Home(APIView):def get(self,request):return render(request,"login.html")

rest-framework认证类

from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializerclass TokenAuth():def authenticate(self, request):token={"token":None}# print(request.META.get("HTTP_TOKEN"))token["token"] = request.META.get('HTTP_TOKEN')valid_data = VerifyJSONWebTokenSerializer().validate(token)print(valid_data)user = valid_data['user']print(user)if user:returnelse:raise AuthenticationFailed('认证失败')

模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/login/" method="post"><input type="text" name="username"><input type="text" name="password"><input type="submit" value="登录">
</form>
</body>
</html>

postman

转载于:https://www.cnblogs.com/angelyan/p/10902551.html

django-rest-framework-jwt的使用相关推荐

  1. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

  2. Django Rest Framework的使用整理

    Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...

  3. Django REST framework的一些奇巧淫技(干货!!!)

    开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...

  4. 10- vue django restful framework 打造生鲜超市 -用户登录和手机注册(中)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 手机注册和用户登录(中) Json Web Token的原理 因为我们的drf 的 ...

  5. Vue+Django REST framework打造生鲜电商项目

    1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...

  6. Django REST Framework教程(10): 限流(throttle)详解与示例

    在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer), 并使用APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限.认证(含j ...

  7. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  8. Django REST framework 简介

    1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改. ...

  9. Django REST framework API 指南(2):响应

    Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...

  10. Django REST framework API 指南(12):验证器

    官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...

最新文章

  1. 计算机前端专业术语,学习计算机知识必须懂得50个专业术语
  2. python3数字全排列怎么搞_python3实现字符串的全排列的方法(无重复字符)
  3. ADAS(3) 各功能模块及解决方案提供商详解
  4. JVM系列五:JVM监测工具[整理中]
  5. Django,js,html数据传输
  6. 推特800赞,DeepMind强化学习综述:她可以很快,但快从慢中来
  7. Android之PopupWindow弹出对话框
  8. Gentle.NET Attribute
  9. 2.卷2(进程间通信)---Posix IPC
  10. 免疫算法(matlab)
  11. 推荐 浙江省国税vpdn安装正确的方法 如何安装后缀为ocx的控件 由于无法验证发布者 ,所以windows 已经阻止次软件
  12. Mac中mvn命令安装配置command not found
  13. 联通服务器光信号亮红灯移动,联通los红灯闪啥意思(图文)
  14. win10 无法安全地连接到此页面 TLS安全设置未设置为默认 该怎么办? 无法访问此页面
  15. 关于阿里云ECS服务器连接RDS数据库
  16. 二分答案(by jie)
  17. 柳传志内部邮件曝光:联想筹备1年等待大反攻
  18. 阿里巴巴公开大数据打假模式
  19. 解禁联想浏览器禁用的网址的方法
  20. 7-55 吉老师的回归 (15 分)

热门文章

  1. sql常用函数详解(一)——字符串截取
  2. java html判断,青岛HTML5入门应怎么判断?
  3. python中不同类型的数据不能相互运算_python语法入门(数据类型、运算)
  4. spark启动的worker节点是localhost_「Spark源码分析1」Spark standalone模式Master和Worker启动流程...
  5. 2022年 微信大数据挑战赛
  6. linux cpu 个数、核心数、线程数
  7. 安装 EoLinker_4.0 开源版
  8. mysql遵循acid_关系型数据库遵循ACID规则
  9. mysql 为什么性能不稳定_浅谈MySQL 数据库性能优化
  10. 计算机名汉字 oracle,修改计算机名对ORACLE的影像