Python Web 框架 Django 如何使用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值判斷使用者資訊、過期時間等資訊,在使用期間內不可能取消令牌或更改令牌許可權。
# 安裝 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方法的引數
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援 。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2690012/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 獲取jwt(json web token)中儲存的使用者資訊JWTJSONWeb
- python使用ldap3獲取使用者資訊PythonLDA
- 使用 GoFrame 框架 JWT 方式驗證使用者資訊GoFrame框架JWT
- .NET Core如何全域性獲取使用者資訊?
- Python之Web框架DjangoPythonWeb框架Django
- 【Python】獲取機器使用資訊Python
- 獲取微信使用者基本資訊
- 使用Python獲取ECS相關資訊Python
- 微信小程式 獲取使用者資訊微信小程式
- Django Web框架/Python框架-李強強-專題視訊課程DjangoWeb框架Python
- JWT驗證使用者資訊功能JWT
- Python全棧Web(Django框架、模板)Python全棧WebDjango框架
- 微信小程式獲取使用者資訊方法微信小程式
- 微信小程式 getUserProfile 獲取使用者資訊微信小程式
- 企業微信登入獲取使用者資訊
- 微信網頁授權並獲取使用者資訊網頁
- flowable 重構流程編輯器獲取使用者資訊
- Node.js 微信小程式獲取使用者資訊Node.js微信小程式
- 通過web url獲取檔案資訊Web
- 分分鐘教你Python Web開發框架DjangoPythonWeb框架Django
- 根據微信code獲取換取使用者登入態資訊
- Hyperf 框架使用 JWT 進行使用者認證框架JWT
- 如何使用Python獲取、寫入localStoragePython
- Gin框架dgrijalva/jwt-go例項(JWT使用者認證)框架JWTGo
- PHP 基於laravel框架獲取微博資料之二 使用者資料的使用PHPLaravel框架
- 微信小程式三種獲取使用者資訊的方式微信小程式
- 微信小程式授權登入獲取使用者資訊微信小程式
- 【Python小隨筆】 SSH 獲取資訊Python
- python django中restful框架的使用PythonDjangoREST框架
- Python全棧Web(Django框架、模型中的CRUD)Python全棧WebDjango框架模型
- python中web開發框架Django的學習PythonWeb框架Django
- 使用捕獲 獲取身份證號的資訊
- 小程式獲取使用者位置資訊後再次手動授權
- Spring Security - 獲取當前登入使用者的詳細資訊Spring
- 支付寶小程式(後臺)---獲取授權和使用者資訊
- 微信小程式 獲取使用者資訊(wx.getUserInfo)調整微信小程式
- 明令禁止下,哪些APP在違規獲取使用者資訊?APP
- 獲取所有域使用者的登陸歷史資訊指令碼指令碼