jwt怎么获取当前登录用户_django--通过jwt获取用户信息的两种方式

本文介绍了JWT在Django中用于接口安全验证的原理和实践,包括JWT的安装配置、用户登录获取token、前端请求时携带token、后端解析token获取用户信息的方法,以及处理不同状态码的响应拦截器实现。
摘要由CSDN通过智能技术生成

HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决session不共享的问题,常用的解决方案有4种:客户端Cookie保存、服务器间Session同步、使用集群管理Session、把Session持久化到数据库。

推荐:https://www.cnblogs.com/ruiati/p/6247588.html关于cookie和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 importJSONWebTokenAuthentication

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',

),

}importdatetime

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 importJSONWebTokenAuthenticationfrom rest_framework.views importexception_handlerfrom rest_framework_jwt.utils importjwt_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方法的参数

OK!结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python Django中,JWT(JSON Web Tokens)是一种常用的用于身份验证的安全机制。JWT允许你在服务器之间安全地传递信息,而无需每次都发送用户名和密码。以下是使用DjangoJWT进行登录验证的一般步骤: 1. 安装依赖库:首先,你需要安装`djangorestframework-jwt`库,它是一个Django REST框架的插件,方便处理JWT。你可以通过运行`pip install djangorestframework-jwt`命令进行安装。 2. 设置认证:在Django项目的settings.py文件中,添加JWT相关的配置,并设置认证后端: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(hours=1), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ALGORITHM': 'HS256', # 使用HS256哈希算法,也可以选择其他的如RS256等 } ``` 3. 创建视图:创建一个API视图,比如`views.py`,并处理登录请求: ```python from rest_framework import generics from rest_framework_simplejwt.views import TokenObtainPairView class CustomTokenObtainPairView(TokenObtainPairView): renderer_classes = [Renderers.JSONRenderer] # 这里是POST请求,接受用户提交的用户名和密码 def post(self, request, *args, **kwargs): data = super().post(request, *args, **kwargs) return Response(data) ``` 4. URL路由:在`urls.py`文件中添加URL以访问登录视图: ```python path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'), ``` 5. 验证JWT:在需要保护的视图中,通常会检查请求头中的Authorization字段是否包含有效的JWT: ```python from rest_framework.permissions import IsAuthenticated class ProtectedView(generics.RetrieveAPIView): permission_classes = [IsAuthenticated] def get_object(self): # 在这里可以根据JWT中的数据获取用户的详细信息 pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值