亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django如何使用jwt獲取用戶信息

瀏覽:194日期:2024-10-10 09:44:42

HTTP請(qǐng)求是無(wú)狀態(tài)的,我們通常會(huì)使用cookie或session對(duì)其進(jìn)行狀態(tài)保持,cookie存儲(chǔ)在客戶端,容易被用戶誤刪,安全性不高,session存儲(chǔ)在服務(wù)端,在服務(wù)器集群情況下需要解決session不共享的問(wèn)題,常用的解決方案有4種:客戶端Cookie保存、服務(wù)器間Session同步、使用集群管理Session、把Session持久化到數(shù)據(jù)庫(kù)。

jwt:json web token

在用戶注冊(cè)登錄后,記錄用戶登錄狀態(tài),我們可以用cookie和session來(lái)做狀態(tài)保持,cookie存儲(chǔ)在客戶端,安全性低,session存儲(chǔ)在服務(wù)器端,安全性高,但是在分布式架構(gòu)中session不能同步化,所以我們用jwt來(lái)驗(yàn)證接口安全

組成:頭部 載荷 簽證

Jwt服務(wù)端不需要存儲(chǔ)token串,用戶請(qǐng)求時(shí)攜帶著經(jīng)過(guò)哈希加密和base64編碼后的字符串過(guò)來(lái),服務(wù)端通過(guò)識(shí)別token值判斷用戶信息、過(guò)期時(shí)間等信息,在使用期間內(nèi)不可能取消令牌或更改令牌權(quán)限。

jwt的安裝與配置

# 安裝 pip install djangorestframework-jwtFrom rest_framework_jwt.authentication import JSONWebTokenAuthenticationSettings.pyINSTALLED_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 datetimeJWT_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)證密碼后返回tokenurlpatterns = [ re_path(r’v1/login/$’, obtain_jwt_token,name=’login’), # 用戶登錄后返回token]

前端獲取到token并且setitem

var token = ’JWT ’ + data.tokenlocalStorage.setItem(’token’, token);

在我們封裝的攔截器里有請(qǐng)求攔截器和響應(yīng)攔截器,需要在每次發(fā)起請(qǐng)求的時(shí)候獲取token

import Axios from ’axios’import { Toast } from ’vant’;import URLS from ’../../config/urls’ //1、使用自定義配置新建一個(gè) axios 實(shí)例const instance = Axios.create({ baseURL: URLS.API_URL, responseType: ’json’,}); //2、添加請(qǐng)求攔截器:每次發(fā)送請(qǐng)求就會(huì)調(diào)用此攔截器,添加認(rèn)證tokeninstance.interceptors.request.use( config => { //發(fā)送請(qǐng)求前添加認(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)登錄頁(yè)面,并攜帶當(dāng)前頁(yè)面的路徑// 在登錄成功后返回當(dāng)前頁(yè)面,這一步需要在登錄頁(yè)操作。case 401: router.replace({ path: ’/login’, query: { redirect: router.currentRoute.fullPath } }); break;// 403 token過(guò)期// 登錄過(guò)期對(duì)用戶進(jìn)行提示// 清除本地token和清空vuex中token對(duì)象// 跳轉(zhuǎn)登錄頁(yè)面case 403: Toast({ message: ’登錄過(guò)期,請(qǐng)重新登錄’, duration: 1000, forbidClick: true }); // 清除token localStorage.removeItem(’token’); store.commit(’loginSuccess’, null); // 跳轉(zhuǎn)登錄頁(yè)面,并將要瀏覽的頁(yè)面fullPath傳過(guò)去,登錄成功后跳轉(zhuǎn)需要訪問(wèn)的頁(yè)面 setTimeout(() => { router.replace({ path: ’/login’, query: {redirect: router.currentRoute.fullPath } }); }, 1000); break;// 404請(qǐng)求不存在case 404: Toast({ message: ’網(wǎng)絡(luò)請(qǐng)求不存在’, duration: 1500, forbidClick: true }); break;// 其他錯(cuò)誤,直接拋出錯(cuò)誤提示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_handlerfrom 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這個(gè)方法不用在前端封裝getitem token 或者從前端傳過(guò)來(lái)token然后獲取.vuevar 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.pydef 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ù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 国产一区中文字幕 | 国产一区曰韩二区欧美三区 | 欧美亚洲精品一区二三 | 亚洲精品一区二区乱码在线观看 | 久久乐国产精品亚洲综合m3u8 | 普通话对白国产情侣自啪 | 日韩美a一级毛片 | 亚洲女人网 | 欧美一级爱操视频 | 日韩欧一级毛片在线播无遮挡 | 亚洲午夜电影一区二区三区 | 国产精品日韩欧美在线 | 麻豆视传媒一区二区三区 | 女人16一毛片 | 偷窥自拍15p | 黄色一级视频网 | 在线观看国产片 | 亚洲国产精品a一区二区三区 | 狠狠色丁香婷综合久久 | 日韩a级片在线观看 | 国产二三区 | 亚洲欧美日韩视频一区 | 欧美精品做人一级爱免费 | 三级大片在线观看 | 国产在线观看高清不卡 | 欧美日韩亚洲二区在线 | 精品你懂的 | 日本高清在线一区二区三区 | 一级生性活免费视频 | 五月天婷婷久久 | 福利国产精品 | 免费看国产黄色片 | miya亚洲私人影院在线 | 国产午夜精品一区二区三区不卡 | 久久国产中文字幕 | 色婷婷中文字幕在线一区天堂 | 国产r级| 日本一级毛片在线观看 | 91久久国产情侣真实对白 | 国产精品毛片在线更新 | 欧美日本日韩 |