django使用JWT保存用户登录信息
作者:苦瓜爆炒牛肉 发布时间:2022-02-19 17:36:58
在使用前必须弄明白JWT的相关知识,可以看我的另一篇博文:https://www.jb51.net/article/166843.htm
什么是JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT最普遍的一个作用就是用来保存用户的登录信息。
JWT的流程
1.签发JWT
在用户正确输入账号密码成功登录后,服务端就会签发JWT。
django使用第三方库djangorestframework-jwt生成JWT,所以先安装第三方包。
pip install djangorestframework-jwt
然后需要在django的配置上增加:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # jwt认证
'rest_framework.authentication.SessionAuthentication', # 管理后台使用
'rest_framework.authentication.BasicAuthentication',
),
...
}
JWT_AUTH = { # 导包: import datetime
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # jwt有效时间
}
然后就可以签发JWT了。
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER # 生payload部分的方法
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 生成jwt的方法
# {'exp': xxx, 'email': '', 'user_id': 1, 'username': 'admin'}
# user:登录的用户对象
payload = jwt_payload_handler(user) # 生成payload, 得到字典
token = jwt_encode_handler(payload) # 生成jwt字符串
生成之后,通过JSON字符串的方式返回给前端。
2.前端保存JWT
前端有两种方式储存数据,分别是localStorage 和 sessionStorage。
HTML5提供了两种在客户端存储数据的新方法:
- localStorage - 永久数据存储; 不同页面数据共享
- sessionStorage - 临时存储,关闭页面或浏览器后会被清除; (读取sessionStorage的数据时,仅当前页面(窗口)有效,但是JWT toekn会保存直到浏览器关闭)
sessionStorage.key = val // 保存数据
sessionStorage.key // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据
sessionStorage.removeItem('key');
localStorage.key = val // 保存数据
localStorage.key // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据
localStorage.removeItem('key');
3.前端发送JWT
前端会通过请求头把JWT带上,传给服务端。
var config = {
headers: { // 请求头
'Authorization': 'JWT ' + this.token # JWT后面有一个空格!
},
};
axios.get('http://api.meiduo.site:8000/test/', config)
.then(response => {})
.catch(error => {});
4.校验JWT
在前端有JWT后,再次登录服务端,服务端就会对这串JWT进行校验,如果有修改就不会通过,如果过期了也不会通过。
来源:https://www.cnblogs.com/chichung/p/9967325.html
猜你喜欢
- 前言 作者: 罗昭成PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.com/not
- 我所希望的iframe功能是不要去控制父页面,如果他想要控制,哪从父页面里面加入什么代码能让他无法控制呢?假如iframe里面有这样的语句:
- 注:答案一般在网上都能够找到。1.对if __name__ == 'main'的理解陈述2.python是如何进行内存管理的
- 一、什么是NumPyNumpy--Numerical Python,是一个基于Python的可以存储和处理大型矩阵的库。几乎是Python
- Pytorch凭借动态图机制,获得了广泛的使用,大有超越tensorflow的趋势,不过在工程应用上,TF仍然占据优势。有的时候我们会遇到这
- Python 正则表达式正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,基本上我们所使用的编程语言都提供了对它的实现,当然了,
- 以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3],如下:>>>
- 邮箱地址验证有很多方法。在浏览器端,js邮箱验证可以通过正则表达式检测。比如:function isEmail(email) {
- 字典的键 字典中的值没有任何限制, 可以是任意Python对象,即从
- 阅读作者的上一篇相关文章:段正淳的css笔记(3)标题右侧“更多”的实现 段正淳的css笔记(4)1、css代码的简写css缩写的语法,对新
- Apache2 httpd.conf 中文版 # # 基于 NCSA 服务的配
- SpringSecurity? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解
- 本文研究的主要是Django开发中的signal 的相关内容,具体如下。前言在web开发中, 你可能会遇到下面这种场景:在用户完成某个操作后
- <div> <a 
- 1、在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Arra
- 目录1. DeepSource2. Codacy3. SonarQube4. Veracode5. Checkmarx6. Coverity
- django 模版显示的html中出现'类似的ascii字符,这是由于django对单引号进行了转义,可以通过关闭转 * 决h
- Hello,Everyone!Python是个好东西!好吧,以黎某人这寒碜的赞美之词,实在上不了台面,望见谅。那我们直接来上干货吧。第一步:
- 本文实例讲述了Python实现简单截取中文字符串的方法。分享给大家供大家参考。具体如下:web应用难免会截取字符串的需求,Python中截取
- 前言Go语言自带的net/http包提供了HTTP客户端和服务端的实现,实现一个简单的http服务非常容易,其自带了一些列结构和方法来帮助开