14.Django-JWT
一、基于JWT的Token登录认证
1. JWT简介
json Web Token(缩写JWT)是目前最流行的跨域认证解决方案
session登录的认证方案是看,用户从客户端传递用户名和密码登录信息,服务端认证后将信息储存在session中,将session_id放入cookie中,以后访问其他页面,服务器都会带着cookie,服务端会自动从cookie中获取session_id,在从session中获取认证信息。
JWT的解决方案是,将认证信息返回个客户端,储存在客户端,下次访问其他页面,需要从客户端传递认证信息回服务器端。
2. JWT原理
JWT原理就是,服务器认证后,生成一个json格式的对象 ,发送个客户端,
{
"用户名": "admin",
"角色": "超级管理员",
"到期时间": "2019-07-13 00:00:00"
}
以后,客户端域服务器通信的时候,都要发回这个json对象,服务器完全靠这个对象认定用户身份,(但肯定不会像上面那样,那么简单的发送一个对象)这样的话,session中就没有数据了,后面更容易实现扩展
3. JWT的数据结构
JWT分为三个部分,header(头部) payload (负载) signature (签名)
一个完整的JWT数据是这样的
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjNmMmc1N2E5MmFhIn0.
eyJpYXQiOjE1NjI4MzM0MDgsImlzcyI6Imh0dHA6XC9cL3d3dy5weWcuY29tIiwiYXVkIjoiaHR0cDpcL1wvd3d3LnB5Zy5jb20iLCJuYmYiOjE1NjI4MzM0MDcsImV4cCI6MTU2MjkxOTgwOCwianRpIjoiM2YyZzU3YTkyYWEiLCJ1c2VyX2lkIjoxfQ.
NFq1qQ-Z5c4pwit8ZkyWEwX6SBXmnHJcc6ZDgSD5nhU
中间是有三个点的,分别就是 头部 负载 和签名 (点在每一行的最后)
3.1 头部 是一个json对象 作用是描述JWT元数据,一般是这样的
{
"alg": "HS256", //表示签名的算法默认是 HMAC SHA256(写成 HS256)
"typ": "JWT" //表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
}
最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。
3.2 负载 也是一个 JSON 对象 ,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用

除了官方字段,你还可以在这个部分定义私有字段
这个 JSON 对象也要使用 Base64URL 算法转成字符串(防止除了用户的人看见嘛)。
注意:JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。(虽然加密了,防止解密的坏人解密后修改在加密)
3.3 签名 是对前两部分的签名(可以理解成在加密一份),防止数据篡改。
首先,需要指定一个密钥(自己设置),这个密钥只有服务器才知道,不能泄露给用户。
使用 Header 里面指定的签名算法(默认是 HMAC SHA256)产生签名
如:HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret) //使用Header 里面指定的签名算法 将头部和负载部用逗号拼接起来,在加上自己设置的秘钥
那么签名就出来的。
签名出来后,现在有了 头部的字符串,和负载的字符串 ,还有签名的,在将这三个字符串用 . 拼接出来,就可以将这个拼接好的字符串,返回给客户端的
JWT数据就返回得了客户端,需要注意的是,头部和负载部,是用base64URL转成字符串的,签名是用头部指定的算法转成字符串的 不用弄混掉
4. JWT 的使用方式
客户端,接受到了服务器返回的jwt,可以储存到cookie中,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
一旦我们使用的JWT,JWT的类别人封装好的,会自动将生成的token放入响应头中去,然后再次去访问页面的时候会带着响应回来token去访问页面
JWT在请求头中发送,如:会多了个请求头
Authorization: Bearer <token>
然后,在服务器中,需要验证这个token,是否有效
二、Django---使用jwt中的token鉴权机制完成状态保持的步骤
1. 安装包 djangorestframework-jwt
pip install djangorestframework-jwt
2. 配置drf, jwt过期时间
REST_FRAMEWORK = {
''''''
# 身份认证的方式:JWT session
'DEFAULT_AUTHENTICATION_CLASSES': (
# 前后端分离使用jwt验证
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
# 访问admin后台使用session
'rest_framework.authentication.SessionAuthentication',
),
}
# 过期时间为10小时
JWT_AUTH = {
# timedelta 时间差
'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=10),
}
3. 在创建use对象的时候手动生成token
# 需要生成token
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload) # header.payload.signature
4. 在序列化中定义只输出的token属性
token = serializers.CharField(read_only=True)
5. 为user添加token属性才能输出到客户端
user.token = token
14.Django-JWT的更多相关文章
- Django JWT Token RestfulAPI用户认证
一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展 创建用户项目 python manage.py startapp users 添加项目apps INSTAL ...
- Django+JWT实现Token认证
对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...
- 14 Django之Form和Model Form组件
一.什么是Form 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...
- 14 Django的用户认证组件
用户认证 auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authentica ...
- Django JWT
概述 如果各位不了解 JWT,不要紧张,它并不可怕. JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个 ...
- 14.django返回展示一张图片
urlpatterns = [ path('admin/', admin.site.urls), # 使用django返回一张土图片的时候需要间接的访问一个中间接口,是html页面的中的img的src ...
- 14. Django MTV及Django模型
MTV 我们或许都听说过MVC模式.MVC是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码.Django ...
- 14.Django自带的admin配置
admin有自己的默认显示,要自定义显示的样式,一般需要自己定义一个类,在自己定义的类里进行相应的设置,然后,把自己的类交给装饰器 交给装饰器的方法有两种: 1.@admin.register(Pub ...
- 14.Django基础之jQuery操作cookie
jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.js基于jquery:先引入jquer ...
- Django集成OpenLDAP认证
本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 版本说明 Django==2.2 django-auth-ldap==1.7.0 集成过程 Django集成LDA ...
随机推荐
- html页面加载顺序
页面总是从上往下执行 CSS为什么要放在头部 1.CSS可以和html一起同时进行解析和渲染 2.如果你把CSS放到body后面,不但没有跟html一起进行加载渲染,还要花费额外时间去加载CSS,这样 ...
- 王玉兰201771010128《面向对象与程序设计(Java)》第十一周学习总结
一:理论知识部分: (1)集合:集合(Collection或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成. A:集合类的 ...
- Spring 基于 Java 的配置
前面已经学习如何使用 XML 配置文件来配置 Spring bean. 基于 Java 的配置可以达到基于XML配置的相同效果. 基于 Java 的配置选项,可以使你在不用配置 XML 的情况下编写大 ...
- 新版Element-UI级联选择器高度位置不对的问题
在做电商后台管理系统项目事遇到的问题,可能视频是去年的,element现在已经是新版本了,有些地方修改了,从而导致了以下问题 级联选择器的位置不对 解决的方法就是在全局css中添加以下代码: .el- ...
- web项目——javax.servlet.ServletException: Circular view path [registerForm]
报错: 控制台输出: 三月 21, 2019 10:12:32 上午 org.springframework.web.servlet.PageNotFound noHandlerFound 警告: N ...
- docker安装和基本使用
1.安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位.系统内核版本为 3.10 以上,可 ...
- spring——bean自动装配
注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...
- MySQL浮点数和定点数
MySQL 分为两种方式:浮点数和定点数.浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示.定点数在 MySQL 内部以字符串形式存放,比浮点数更精 ...
- java class 字节码
java class 字节码 协议: class文件 魔数(Magic):4byte -> 0xCAFEBABE 类似2f3f 版本(Version):4Byte -> 0x0000003 ...
- C#线程 基本同步
第二部分: 基本同步 同步要点 到目前为止,我们已经描述了如何在线程上启动任务,配置线程以及双向传递数据.我们还描述了局部变量如何专用于线程,以及如何在线程之间共享引用,从而允许它们通过公共字段进行 ...