Django如何使用jwt获取用户信息
作者:小陆同学 发布时间:2022-07-06 10:08:34
标签:Django,jwt,用户,信息
HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决session不共享的问题,常用的解决方案有4种:客户端Cookie保存、服务器间Session同步、使用集群管理Session、把Session持久化到数据库。
jwt:json web token
在用户注册登录后,记录用户登录状态,我们可以用cookie和session来做状态保持,cookie存储在客户端,安全性低,session存储在服务器端,安全性高,但是在分布式架构中session不能同步化,所以我们用jwt来验证接口安全
组成:头部 载荷 签证
Jwt服务端不需要存储token串,用户请求时携带着经过哈希加密和base64编码后的字符串过来,服务端通过识别token值判断用户信息、过期时间等信息,在使用期间内不可能取消令牌或更改令牌权限。
jwt的安装与配置
# 安装 pip install djangorestframework-jwt
From rest_framework_jwt.authentication import JSONWebTokenAuthentication
Settings.py
INSTALLED_APPS = [
'''
'rest_framework.authtoken',
'''
]
################### 2、配置jwt验证 ######################
REST_FRAMEWORK = {
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
import datetime
JWT_AUTH = {
'JWT_AUTH_HEADER_PREFIX': 'JWT',
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
AUTH_USER_MODEL='app.User' # 指定使用APP中的 model User进行验证
在django中,我们用内置的User表做登录功能
from rest_framework_jwt.views import obtain_jwt_token # 验证密码后返回token
urlpatterns = [
re_path(r'v1/login/$', obtain_jwt_token,name='login'), # 用户登录后返回token
]
前端获取到token并且setitem
var token = 'JWT ' + data.token
localStorage.setItem('token', token);
在我们封装的 * 里有请求 * 和响应 * ,需要在每次发起请求的时候获取token
import Axios from 'axios'
import { Toast } from 'vant';
import URLS from '../../config/urls'
//1、使用自定义配置新建一个 axios 实例
const instance = Axios.create({
baseURL: URLS.API_URL,
responseType: 'json',
});
//2、添加请求 * :每次发送请求就会调用此 * ,添加认证token
instance.interceptors.request.use(
config => {
//发送请求前添加认证token,
console.log(localStorage.getItem('token'))
config.headers.Authorization = localStorage.getItem('token'); # 获取token
// config.headers.Authorization = sessionStorage.getItem('token')
return config
},
err => {
return Promise.reject(err)
});
// 3、响应 *
instance.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: { redirect: router.currentRoute.fullPath }
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
);
export default instance
这样即完成了jwt接口安全的认证
那么在python后端如何去获取jwt并提取我们需要的信息呢?
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.views import exception_handler
from rest_framework_jwt.utils import jwt_decode_handler
# 获取登陆的用户
token = request.META.get('HTTP_AUTHORIZATION')[4:]
token_user = jwt_decode_handler(token)
user_id = token_user['user_id'] # 获取用户id
这个方法不用在前端封装getitem token
或者从前端传过来token然后获取
.vue
var formdata = {
id : this.$route.params.id, // 获取/id
// this.$route.query.subid 获取?subid=id
token: localStorage.getItem('token'),
}
postCreate(formdata).then(resp=>{
console.log(resp)
alert(resp.mes)
}).catch(err=>{
alert(err)
console.log(err)
})
}
python views.py
def post(self,request):
data = request.data # 获取post方法的数据
# print(data)
token = data.get('token')[4:]
toke_user = jwt_decode_handler(token)
user_id = toke_user['user_id']
def get(self,request):
data = request.query_params # 获取get方法的参数
来源:https://www.cnblogs.com/lutt/p/11154902.html
0
投稿
猜你喜欢
- 今天的这篇文章呢,小编来介绍一下如何通过Python来创建各种形式的文件,这里包括了文本文件CSV文件Excel文件压缩文件XML文件JSO
- MySQL各版本,对于add Index的处理方式是不同的,主要有三种:(1)Copy Table方式这是InnoDB最早支持的创建索引的方
- 锚点是“top”,可以放在页面的任何位置,一般是页首。程序就是对锚点出现的判断,我设置的数值是4,意思是出现4个动态数据就出现一个锚点,少于
- 前言:当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题
- 近来,越来越多的数据科学家开始使用Python,我不由得想到,尽管他们从pandas、scikit-learn和numpy这些库中得到了不少
- 利用Tkinter实现彩球碰撞屏保,供大家参考,具体内容如下一、架构与思路(1)主函数:main():通过类启动程序;(2)类:Screen
- 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析unittest单元测试原理,主要介绍单元测试,unittest模块特
- 异常的参数一个异常可以带上参数,可作为输出的异常信息参数。你可以通过except语句来捕获异常的参数,如下所示:变量接收的异常值通常包含在异
- 废话不多说了,直接给大家贴代码了,代码写的不好还去各位大侠见谅。#-*-coding:utf-8-*- #1、字典dict = {'
- 一.MYSQL的命令行模式的设置桌面->我的电脑->属性->环境变量->新建->PATH=“;path\mys
- 有两种类型的回调函数:blocking callbacks (also known as synchronous callbacks or
- 一、token是什么 Token: 访问资源的凭证。一般用户通过用户名密码登录后,服务端会将登录凭证做数字签名,加密之后的字符串作
- Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合写在前面Python唯一支持
- 前言本文小编带大家一起学习的是在 JavaScript 中使用构造器函数(construcor function)模拟类。下面话不多说,感兴
- Web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:ASP、PHP
- 本文为大家讲解了python算法表示概念,供大家参考,具体内容如下常数阶O(1)常数又称定数,是指一个数值不变的常量,与之相反的是变量为什么
- 1、命令模式(按Esc键):Enter:转入编辑模式Shift-Enter:运行本单元,选中下个单元Ctrl-Enter:运行本单元Alt-
- 密钥密码'''如密钥短语密码为: university -> universty明文: abcdefghijk
- Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍p
- 过年GUI博客二连发,本打算出去玩玩,奈何空气,天气实在差,遂使用tkinter开发一款GUI刷屏器,写此博客记录一下我的开发思路。一.准备