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将人民币转换大写的脚本代码
Feb 10 Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
python实现最速下降法
Mar 24 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
windows安装python超详细图文教程
May 21 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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生成带有雪花背景的验证码
2006/10/09 PHP
PHP安全配置
2006/10/09 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
js数字转换为float,取N位小数
2014/02/08 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
python复制文件的方法实例详解
2015/05/22 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
python图片验证码生成代码
2016/07/02 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
tensorflow 实现数据类型转换
2020/02/17 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
毕业生医学检验求职信
2013/10/16 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
设备售后服务承诺书
2014/05/30 职场文书
委托书怎样写
2014/08/30 职场文书
大学生党员个人总结
2015/02/13 职场文书
投标售后服务承诺书
2015/04/29 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL