jwt怎么获取当前登录用户_Django如何使用jwt获取用户信息

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方法的参数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Django如何使用jwt获取用户信息

本文地址: http://www.cppcns.com/jiaoben/python/309113.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值