django-rest-framework-jwt的使用
一简介
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的使用相关推荐
- JWT验证机制【刘新宇】【Django REST framework中使用JWT】
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...
- Django Rest Framework的使用整理
Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...
- Django REST framework的一些奇巧淫技(干货!!!)
开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...
- 10- vue django restful framework 打造生鲜超市 -用户登录和手机注册(中)
Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 手机注册和用户登录(中) Json Web Token的原理 因为我们的drf 的 ...
- Vue+Django REST framework打造生鲜电商项目
1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...
- Django REST Framework教程(10): 限流(throttle)详解与示例
在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer), 并使用APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限.认证(含j ...
- 03 Django REST Framework 视图和路由
01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...
- Django REST framework 简介
1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改. ...
- Django REST framework API 指南(2):响应
Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...
- Django REST framework API 指南(12):验证器
官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...
最新文章
- 计算机前端专业术语,学习计算机知识必须懂得50个专业术语
- python3数字全排列怎么搞_python3实现字符串的全排列的方法(无重复字符)
- ADAS(3) 各功能模块及解决方案提供商详解
- JVM系列五:JVM监测工具[整理中]
- Django,js,html数据传输
- 推特800赞,DeepMind强化学习综述:她可以很快,但快从慢中来
- Android之PopupWindow弹出对话框
- Gentle.NET Attribute
- 2.卷2(进程间通信)---Posix IPC
- 免疫算法(matlab)
- 推荐 浙江省国税vpdn安装正确的方法 如何安装后缀为ocx的控件 由于无法验证发布者 ,所以windows 已经阻止次软件
- Mac中mvn命令安装配置command not found
- 联通服务器光信号亮红灯移动,联通los红灯闪啥意思(图文)
- win10 无法安全地连接到此页面 TLS安全设置未设置为默认 该怎么办? 无法访问此页面
- 关于阿里云ECS服务器连接RDS数据库
- 二分答案(by jie)
- 柳传志内部邮件曝光:联想筹备1年等待大反攻
- 阿里巴巴公开大数据打假模式
- 解禁联想浏览器禁用的网址的方法
- 7-55 吉老师的回归 (15 分)
热门文章
- sql常用函数详解(一)——字符串截取
- java html判断,青岛HTML5入门应怎么判断?
- python中不同类型的数据不能相互运算_python语法入门(数据类型、运算)
- spark启动的worker节点是localhost_「Spark源码分析1」Spark standalone模式Master和Worker启动流程...
- 2022年 微信大数据挑战赛
- linux cpu 个数、核心数、线程数
- 安装 EoLinker_4.0 开源版
- mysql遵循acid_关系型数据库遵循ACID规则
- mysql 为什么性能不稳定_浅谈MySQL 数据库性能优化
- 计算机名汉字 oracle,修改计算机名对ORACLE的影像