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中join和split用法实例
Apr 14 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
python使用tornado实现登录和登出
Jul 28 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
TensorFlow打印输出tensor的值
Apr 19 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
python3实现常见的排序算法(示例代码)
Jul 04 Python
详解OpenCV曝光融合
Apr 29 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内存不够用的快速解决方法
2013/10/26 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
浅谈Python中的bs4基础
2018/10/21 Python
Django的CVB实例详解
2020/02/10 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
详解python 内存优化
2020/08/17 Python
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
大专生的学习自我评价
2013/12/04 职场文书
初中化学教学反思
2014/01/23 职场文书
环保专项行动方案
2014/05/12 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
中职生自荐信范文
2014/06/15 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
歌剧魅影观后感
2015/06/05 职场文书
七年级英语教学反思
2016/02/15 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
详解vue身份认证管理和租户管理
2021/05/25 Vue.js