Django如何使用jwt獲取用戶信息
HTTP請求是無狀態(tài)的,我們通常會使用cookie或session對其進(jìn)行狀態(tài)保持,cookie存儲在客戶端,容易被用戶誤刪,安全性不高,session存儲在服務(wù)端,在服務(wù)器集群情況下需要解決session不共享的問題,常用的解決方案有4種:客戶端Cookie保存、服務(wù)器間Session同步、使用集群管理Session、把Session持久化到數(shù)據(jù)庫。
jwt:json web token
在用戶注冊登錄后,記錄用戶登錄狀態(tài),我們可以用cookie和session來做狀態(tài)保持,cookie存儲在客戶端,安全性低,session存儲在服務(wù)器端,安全性高,但是在分布式架構(gòu)中session不能同步化,所以我們用jwt來驗(yàn)證接口安全
組成:頭部 載荷 簽證
Jwt服務(wù)端不需要存儲token串,用戶請求時攜帶著經(jīng)過哈希加密和base64編碼后的字符串過來,服務(wù)端通過識別token值判斷用戶信息、過期時間等信息,在使用期間內(nèi)不可能取消令牌或更改令牌權(quán)限。
jwt的安裝與配置
# 安裝 pip install djangorestframework-jwt
From rest_framework_jwt.authentication import JSONWebTokenAuthentication
Settings.py
INSTALLED_APPS = [
'''
'rest_framework.authtoken',
'''
]
################### 2、配置jwt驗(yàn)證 ######################
REST_FRAMEWORK = {
# 身份認(rèn)證
'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進(jìn)行驗(yàn)證
在django中,我們用內(nèi)置的User表做登錄功能
from rest_framework_jwt.views import obtain_jwt_token # 驗(yàn)證密碼后返回token urlpatterns = [ re_path(r'v1/login/$', obtain_jwt_token,name='login'), # 用戶登錄后返回token ]
前端獲取到token并且setitem
var token = 'JWT ' + data.token
localStorage.setItem('token', token);
在我們封裝的攔截器里有請求攔截器和響應(yīng)攔截器,需要在每次發(fā)起請求的時候獲取token
import Axios from 'axios'
import { Toast } from 'vant';
import URLS from '../../config/urls'
//1、使用自定義配置新建一個 axios 實(shí)例
const instance = Axios.create({
baseURL: URLS.API_URL,
responseType: 'json',
});
//2、添加請求攔截器:每次發(fā)送請求就會調(diào)用此攔截器,添加認(rèn)證token
instance.interceptors.request.use(
config => {
//發(fā)送請求前添加認(rèn)證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、響應(yīng)攔截器
instance.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服務(wù)器狀態(tài)碼不是200的情況
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登錄
// 未登錄則跳轉(zhuǎn)登錄頁面,并攜帶當(dāng)前頁面的路徑
// 在登錄成功后返回當(dāng)前頁面,這一步需要在登錄頁操作。
case 401:
router.replace({
path: '/login',
query: { redirect: router.currentRoute.fullPath }
});
break;
// 403 token過期
// 登錄過期對用戶進(jìn)行提示
// 清除本地token和清空vuex中token對象
// 跳轉(zhuǎn)登錄頁面
case 403:
Toast({
message: '登錄過期,請重新登錄',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳轉(zhuǎn)登錄頁面,并將要瀏覽的頁面fullPath傳過去,登錄成功后跳轉(zhuǎn)需要訪問的頁面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404請求不存在
case 404:
Toast({
message: '網(wǎng)絡(luò)請求不存在',
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接口安全的認(rèn)證
那么在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方法的數(shù)據(jù)
# 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方法的參數(shù)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Django配置JWT認(rèn)證方式
- Django JWT Token RestfulAPI用戶認(rèn)證詳解
- 自定義Django_rest_framework_jwt登陸錯誤返回的解決
- django使用JWT保存用戶登錄信息
- Django項(xiàng)目中使用JWT的實(shí)現(xiàn)代碼
- django drf框架中的user驗(yàn)證以及JWT拓展的介紹
- Django rest framework jwt的使用方法詳解
- 微信小程序登錄對接Django后端實(shí)現(xiàn)JWT方式驗(yàn)證登錄詳解
- 淺談django rest jwt vue 跨域問題
- Django 實(shí)現(xiàn)jwt認(rèn)證的示例
相關(guān)文章
python使用ctypes調(diào)用dll遇到的坑解決記錄
這篇文章主要為大家介紹了python使用ctypes調(diào)用dll遇到的坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python中使用subprocess庫創(chuàng)建附加進(jìn)程
這篇文章主要介紹了subprocess庫:Python中創(chuàng)建附加進(jìn)程的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
python基礎(chǔ)教程之實(shí)現(xiàn)石頭剪刀布游戲示例
使用PYTHON設(shè)計(jì)一個"石頭,剪子,布"游戲,有時又叫"Rochambeau",下面是實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02

