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的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python实现带下标索引的遍历操作示例
May 30 Python
Python socket 套接字实现通信详解
Aug 27 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Django Path转换器自定义及正则代码实例
May 29 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
用Python制作音乐海报
Jan 26 Python
TensorFlow的自动求导原理分析
May 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
python3 简单实现组合设计模式
2020/07/02 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
金融专业求职信
2014/08/05 职场文书
科学育儿宣传标语
2014/10/08 职场文书
品德与社会教学反思
2016/02/24 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
Python数据类型最全知识总结
2021/05/31 Python
如何Python使用re模块实现okenizer
2022/04/30 Python
php解析非标准json、非规范json的方式实例
2022/05/10 PHP