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局部赋值的规则
Mar 07 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Python实现进程同步和通信的方法
Jan 02 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python科学计算之narray对象用法
Nov 25 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 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的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
Js切换功能的简单方法
2010/11/23 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
JavaScript的继承实现小结
2017/05/07 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Python中for循环详解
2014/01/17 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
python高级特性简介
2020/08/13 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
应聘护士自荐信
2013/10/21 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
养成教育经验材料
2014/05/26 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
《春酒》教学反思
2016/02/22 职场文书