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编写脚本获取手机当前应用apk的信息
Jul 21 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
在Python中使用模块的教程
Apr 27 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
python向图片里添加文字
Nov 26 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
用Python制作音乐海报
Jan 26 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实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
简单的js分页脚本
2009/05/21 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
python中global用法实例分析
2015/04/30 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python对切片命名的实现方法
2018/10/16 Python
python生成requirements.txt的两种方法
2019/09/18 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
大学生个人求职信范文
2013/09/21 职场文书
致200米运动员广播稿
2014/02/06 职场文书
体育之星事迹材料
2014/05/11 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
运动会班级前导词
2015/07/20 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
Python+Tkinter制作专属图形化界面
2022/04/01 Python