Django如何使用jwt获取用户信息


Posted in Python onApril 21, 2020

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方法的参数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 字典dict使用介绍
Nov 30 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
Python实现简单的2048小游戏
Mar 01 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 #Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 #Python
基于python实现数组格式参数加密计算
Apr 21 #Python
python实现与redis交互操作详解
Apr 21 #Python
Django-migrate报错问题解决方案
Apr 21 #Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 #Python
jupyter 导入csv文件方式
Apr 21 #Python
You might like
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
python yield和Generator函数用法详解
2020/02/10 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
平面设计的岗位职责
2013/11/08 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
小学生获奖感言范文
2014/02/02 职场文书
毕业生自荐书
2014/02/02 职场文书
预备党员表决心书
2014/03/11 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
新手初学Java网络编程
2021/07/07 Java/Android