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 流程控制实例代码
Sep 25 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
python 连接sqlite及简单操作
Jun 30 Python
django rest framework之请求与响应(详解)
Nov 06 Python
python如何修改装饰器中参数
Mar 20 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
pytorch的梯度计算以及backward方法详解
Jan 10 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/06/08 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
php xhprof使用实例详解
2019/04/15 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
浅谈js闭包理解
2019/04/01 Javascript
js尾调用优化的实现
2019/05/23 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
在python中的socket模块使用代理实例
2014/05/29 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
深入理解python中的atexit模块
2017/03/07 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
python面试题之列表声明实例分析
2019/07/08 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
django正续或者倒序查库实例
2020/05/19 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
关于元旦的广播稿
2014/02/16 职场文书
感谢信范文大全
2015/01/23 职场文书
php 原生分页
2021/04/01 PHP
TV动画《间谍过家家》公开PV
2022/03/20 日漫