您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python Web框架Django怎么使用jwt獲取用戶信息”,在日常操作中,相信很多人在Python Web框架Django怎么使用jwt獲取用戶信息問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python Web框架Django怎么使用jwt獲取用戶信息”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
undefined
jwt:json web token
在用戶注冊登錄后,記錄用戶登錄狀態(tài),我們可以用cookie和session來做狀態(tài)保持,cookie存儲在客戶端,安全性低,session存儲在服務(wù)器端,安全性高,但是在分布式架構(gòu)中session不能同步化,所以我們用jwt來驗證接口安全
組成:頭部 載荷 簽證
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驗證 ###################### 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)行驗證
在django中,我們用內(nèi)置的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);
在我們封裝的攔截器里有請求攔截器和響應(yīng)攔截器,需要在每次發(fā)起請求的時候獲取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、添加請求攔截器:每次發(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ù)
到此,關(guān)于“Python Web框架Django怎么使用jwt獲取用戶信息”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。