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 解析XML文件
Apr 15 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
python操作mysql代码总结
Jun 01 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python获取url的返回信息方法
Dec 17 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
python对csv文件追加写入列的方法
Aug 01 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 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
PHP中的超全局变量
2006/10/09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
jQuery 动画基础教程
2008/12/25 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
javascript实现固定侧边栏
2021/02/09 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python中encode()方法的使用简介
2015/05/18 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
林肯就职演讲稿
2014/05/19 职场文书
爱与责任演讲稿
2014/05/20 职场文书
新教师培训心得体会
2014/09/02 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
赞美教师的句子
2019/09/02 职场文书
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android