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深入学习之对象的属性
Aug 31 Python
Python中super的用法实例
May 28 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
PyQt5每天必学之切换按钮
Aug 20 Python
pytorch索引查找 index_select的例子
Aug 18 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
记录模型训练时loss值的变化情况
Jun 16 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 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
用session做客户验证时的注意事项
2006/10/09 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
python字典操作实例详解
2017/11/16 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python实现Restful API的例子
2019/08/31 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
如何手工释放资源
2013/12/15 面试题
门面房租房协议书
2014/08/20 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
python flappy bird小游戏分步实现流程
2022/02/15 Python