Django rest framework jwt的使用方法详解


Posted in Python onAugust 08, 2019

一简介

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 TokenAuth
class 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 VerifyJSONWebTokenSerializer
class 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:
      return
    else:
      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

Django rest framework jwt的使用方法详解

Django rest framework jwt的使用方法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python模块之StringIO使用示例
Apr 08 Python
Python代码缩进和测试模块示例详解
May 07 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
详解python深浅拷贝区别
Jun 24 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 #Python
django基于restframework的CBV封装详解
Aug 08 #Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 #Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 #Python
Python generator生成器和yield表达式详解
Aug 08 #Python
利用python实现短信和电话提醒功能的例子
Aug 08 #Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 #Python
You might like
PHP中的extract的作用分析
2008/04/09 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
python 表格打印代码实例解析
2019/10/12 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
办公室文秘岗位职责
2013/11/15 职场文书
护士检查书
2014/01/17 职场文书
移风易俗倡议书
2014/04/15 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
培训师岗位职责
2015/02/14 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
给朋友的赠语
2015/06/23 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server