欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年04月21日 17:12:10   作者:小陸同學(xué)  
這篇文章主要介紹了Django如何使用jwt獲取用戶信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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-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);

在我們封裝的攔截器里有請(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)證token
instance.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_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
這個(gè)方法不用在前端封裝getitem token 



或者從前端傳過(guò)來(lái)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ù)

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

相關(guān)文章

  • python爬取全國(guó)水雨情信息詳解

    python爬取全國(guó)水雨情信息詳解

    這篇文章主要為大家詳細(xì)介紹了python爬取全國(guó)水雨情信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • python使用ctypes調(diào)用dll遇到的坑解決記錄

    python使用ctypes調(diào)用dll遇到的坑解決記錄

    這篇文章主要為大家介紹了python使用ctypes調(diào)用dll遇到的坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Python中使用subprocess庫(kù)創(chuàng)建附加進(jìn)程

    Python中使用subprocess庫(kù)創(chuàng)建附加進(jìn)程

    這篇文章主要介紹了subprocess庫(kù):Python中創(chuàng)建附加進(jìn)程的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 一文帶你弄懂Python3中的def?__init__

    一文帶你弄懂Python3中的def?__init__

    說(shuō)起基礎(chǔ)的init函數(shù)也是我們的老朋友了,組合函數(shù)的要么是理解又一定的難度,要么是操作方法有復(fù)雜的地方,小編今天要講的def __init()__屬于第一種,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一文帶你弄懂Python3中的def?__init__的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • python基礎(chǔ)教程之實(shí)現(xiàn)石頭剪刀布游戲示例

    python基礎(chǔ)教程之實(shí)現(xiàn)石頭剪刀布游戲示例

    使用PYTHON設(shè)計(jì)一個(gè)"石頭,剪子,布"游戲,有時(shí)又叫"Rochambeau",下面是實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-02-02
  • 詳解Django通用視圖中的函數(shù)包裝

    詳解Django通用視圖中的函數(shù)包裝

    這篇文章主要介紹了詳解Django通用視圖中的函數(shù)包裝,Django是最具人氣的Python web開(kāi)發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • Python?GUI布局工具Tkinter入門之旅

    Python?GUI布局工具Tkinter入門之旅

    這篇文章主要為大家介紹了Python?GUI布局工具Tkinter的基礎(chǔ),Tkinter?作為?Python?的標(biāo)準(zhǔn)庫(kù),是非常流行的?Python?GUI?工具,同時(shí)也是非常容易學(xué)習(xí)的,今天我們就來(lái)開(kāi)啟?Tkinter的入門之旅
    2022-08-08
  • 理解Python中的絕對(duì)路徑和相對(duì)路徑

    理解Python中的絕對(duì)路徑和相對(duì)路徑

    本篇文章主要介紹了理解Python中的絕對(duì)路勁和相對(duì)路徑 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 如何利用Python獲取文本中的電話號(hào)碼實(shí)例代碼

    如何利用Python獲取文本中的電話號(hào)碼實(shí)例代碼

    Python的文本處理是經(jīng)常碰到的一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于如何利用Python獲取文本中的電話號(hào)碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Numpy的各種下標(biāo)操作的示例代碼

    Numpy的各種下標(biāo)操作的示例代碼

    本文主要介紹了Numpy的各種下標(biāo)操作的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論