HTTP請求是無狀態的,咱們一般會使用cookie或session對其進行狀態保持,cookie存儲在客戶端,容易被用戶誤刪,安全性不高,session存儲在服務端,在服務器集羣狀況下須要解決session不共享的問題,經常使用的解決方案有4種:客戶端Cookie保存、服務器間Session同步、使用集羣管理Session、把Session持久化到數據庫。javascript
推薦:https://www.cnblogs.com/ruiati/p/6247588.html關於cookie和session的運行機制,以及四種解決session共享的對比介紹html
jwt:json web token 前端
在用戶註冊登陸後,記錄用戶登陸狀態,咱們能夠用cookie和session來作狀態保持,cookie存儲在客戶端,安全性低,session存儲在服務器端,安全性高,可是在分佈式架構中session不能同步化,因此咱們用jwt來驗證接口安全vue
組成:頭部 載荷 簽證java
Jwt服務端不須要存儲token串,用戶請求時攜帶着通過哈希加密和base64編碼後的字符串過來,服務端經過識別token值判斷用戶信息、過時時間等信息,在使用期間內不可能取消令牌或更改令牌權限。ios
jwt的安裝與配置web
# 安裝 pip install djangorestframework-jwt From rest_framework_jwt.authentication import JSONWebTokenAuthentication Settings.py INSTALLED_APPS = [ ''' 'rest_framework.authtoken', ''' ] ################### 二、配置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表作登陸功能vuex
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' //一、使用自定義配置新建一個 axios 實例 const instance = Axios.create({ baseURL: URLS.API_URL, responseType: 'json', }); //二、添加請求攔截器:每次發送請求就會調用此攔截器,添加認證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) }); // 三、響應攔截器 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接口安全的認證django