最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django應(yīng)用JWT(JSON?Web?Token)實戰(zhàn)教程

 更新時間:2024年10月15日 11:49:00   作者:xiejava1018  
在前后端分離的項目中,JWT(JSON?Web?Token)作為一種廣泛使用的身份驗證和授權(quán)機制,提供了一種安全、高效的方式來保護RESTful?API,本文詳細介紹了JWT的概念、優(yōu)勢、在Django中的應(yīng)用步驟和使用方法,是構(gòu)建安全、高效Web應(yīng)用的有效指南

在前后端分離的項目中,前后端進行身份驗證通常用JWT來進行,JWT 提供了一個理想的認證解決方案,用來保護 RESTful API,確保只有經(jīng)過認證的用戶才能訪問受保護的資源?;谇岸丝蚣埽ㄈ鏡eact, Angular, Vue.js)的單頁面應(yīng)用 (SPA),開發(fā)者通過使用 JWT可以獲得一種簡單、安全、高效的方式來處理用戶認證和授權(quán)的問題。本文通過django項目的實戰(zhàn)來說明如何應(yīng)用和使用JWT。

一、什么是JWT

JWT(JSON Web Token)是一種開放標準(RFC 7519),用于在網(wǎng)絡(luò)各方之間以安全且緊湊的形式傳輸信息。JWT 是一個小型的憑證,通常用于身份驗證和授權(quán)場景。JWT 由三部分組成:頭部 (Header)、負載 (Payload) 和簽名 (Signature)。
JWT信息由3段構(gòu)成,它們之間用圓點“.”連接,格式如下:

aaaaaa.bbbbbb.cccccc

一個典型的JWT如下所示:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI2OTcyMDc2LCJpYXQiOjE3MjY5NzAyNzYsImp0aSI6IjMyMTFiZjdmZDlhZTRmNTBhMDNmOGM2NjcwNDM2NjFiIiwidXNlcl9pZCI6Mn0.Ej6US4Uk-sSNm9P8kTU_cDAzBpO4I-BLhPstp5sG00Q
  • 頭部 (Header):包含了關(guān)于 JWT 類型的信息以及所使用的簽名算法。
  • 負載 (Payload):是 JWT 的主體部分,包含了實際需要聲明的數(shù)據(jù)。這些數(shù)據(jù)通常包括用戶ID、用戶名、角色等信息。
  • 簽名 (Signature):用于驗證 JWT 的發(fā)送者就是它聲稱的發(fā)送者,同時也確保了 JWT 在傳輸過程中沒有被篡改。

二、為什么使用JWT

使用 JWT 的原因主要有以下幾點:

  • 安全性:JWT 通過簽名來保證數(shù)據(jù)的完整性和防篡改性。如果有人試圖修改 JWT 內(nèi)容,簽名會失效,接收方可以檢測到這一行為。
  • 無狀態(tài)性:JWT 是自包含的,這意味著不需要在服務(wù)器上保存會話狀態(tài)。每個 JWT 都包含了所有必要的信息,從而減少了對服務(wù)器端存儲的需求。
  • 跨域支持:JWT 可以輕松地在不同的域之間共享,這使得它非常適合微服務(wù)架構(gòu)和分布式系統(tǒng)。
  • 性能提升:由于 JWT 是自包含的,所以服務(wù)器可以快速地驗證 JWT,而無需查詢數(shù)據(jù)庫來獲取用戶信息,這提高了應(yīng)用的響應(yīng)速度。
  • 易于緩存和擴展:JWT 可以被緩存,并且因為它們是無狀態(tài)的,所以可以很容易地擴展到多個服務(wù)器,而無需擔心會話復(fù)制問題。CSRF 防護:使用 JWT 可以幫助緩解跨站請求偽造(CSRF)攻擊的風(fēng)險,因為 JWT 不依賴于 cookie,也就不會隨同 HTTP 請求自動發(fā)送。

總的來說,JWT 提供了一種高效、安全的方式來處理用戶認證和授權(quán),尤其是在需要跨域操作或構(gòu)建無狀態(tài)服務(wù)的情況下。

三、在django項目中如何應(yīng)用JWT

JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)應(yīng)用中安全地傳輸信息的令牌。它通常用于身份驗證和授權(quán),特別是在單頁應(yīng)用(SPA)和API服務(wù)中。在Django中應(yīng)用JWT,可以使用 djangorestframework-simplejwt。

1、安裝djangorestframework-simplejwt庫:

pip install djangorestframework-simplejwt

2、在settings.py中配置JWT認證:

在INSTALLED_APPS中添加rest_framework_simplejwt的應(yīng)用

INSTALLED_APPS = [
    'blog',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework_simplejwt',  # 添加 simplejwt 應(yīng)用
    'django_filters',  # 注冊條件查詢
    'mdeditor',  # 注冊markdown的應(yīng)用
    'drf_yasg2',  # 接口文檔
]

添加REST_FRAMEWORK的默認認證類為JWT認證

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

添加SIMPLE_JWT的相關(guān)配置

# JWT 相關(guān)設(shè)置
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),  # 訪問令牌的有效時間
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),  # 刷新令牌的有效時間
    'ROTATE_REFRESH_TOKENS': False,  # 是否允許刷新令牌循環(huán)
    'BLACKLIST_AFTER_ROTATION': True,  # 刷新令牌后是否加入黑名單
    'UPDATE_LAST_LOGIN': False,  # 登錄時是否更新最后登錄時間
    'ALGORITHM': 'HS256',  # 簽名算法
    'SIGNING_KEY': SECRET_KEY,  # 簽名密鑰
    'VERIFYING_KEY': None,  # 驗證密鑰
    'AUDIENCE': None,  # 觀眾
    'ISSUER': None,  # 發(fā)行人
    'JWK_URL': None,  # JWK URL
    'LEEWAY': 0,  # 寬限期
    'AUTH_HEADER_TYPES': ('Bearer',),  # 授權(quán)頭類型
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',  # 授權(quán)頭名稱
    'USER_ID_FIELD': 'id',  # 用戶 ID 字段
    'USER_ID_CLAIM': 'user_id',  # 用戶 ID 聲明
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),  # 認證令牌類
    'TOKEN_TYPE_CLAIM': 'token_type',  # 令牌類型聲明
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',  # 滑動令牌刷新過期聲明
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),  # 滑動令牌有效時間
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),  # 滑動令牌刷新有效時間
}

3、在urls.py中配置JWT的獲取和刷新路由:

from django.urls import path
from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView)
urlpatterns = [
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    # 其他路由...
]

4、在視圖中需要認證的地方使用JWT認證

如下modelviweset中使用,對于查詢方法如list,retrieve不做鑒權(quán),對于其他方法需要鑒權(quán)。

def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    if self.action in ['list', 'retrieve']:
        # 對于list方法,返回AllowAny權(quán)限類,表示不需要鑒權(quán)
        permission_classes = [AllowAny, ]
    else:
        # 對于其他方法,返回IsAuthenticated權(quán)限類,表示需要用戶已認證
        permission_classes = [IsAuthenticated, ]
    return [permission() for permission in permission_classes]

四、JWT如何使用

通過上面的應(yīng)用后,使用接口調(diào)用遇到需要鑒權(quán)的會提示需要認證。
如當我們調(diào)用刪除接口時,如果沒有獲得鑒權(quán),接口會返回需要認證的信息。

那如何通過JWT進行認證呢?

下面通過postman來應(yīng)用JWT的使用過程。

1、調(diào)用生成JWT的接口獲取JWT

2、客戶端保存JWT在調(diào)用接口時帶上獲取的JWT

至此,本文介紹了什么時JWT,為什么要使用JWT,通過django實現(xiàn)JWT,介紹了JWT的使用流程,最后以一個具體API接口實例的調(diào)用來說明JWT如何使用。后續(xù)將介紹VUE從前端登錄獲取JWT到JWT認證的實例。

參考資料:http://xiejava.ishareread.com/

到此這篇關(guān)于django應(yīng)用JWT(JSON Web Token)實戰(zhàn)教程的文章就介紹到這了,更多相關(guān)django應(yīng)用JWT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 常用日期處理-- datetime 模塊的使用

    python 常用日期處理-- datetime 模塊的使用

    這篇文章主要介紹了python 如何對日期進行處理,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Python3中使用zipfile進行文件的壓縮和解壓縮實現(xiàn)

    Python3中使用zipfile進行文件的壓縮和解壓縮實現(xiàn)

    zipfile是Python標準庫中處理ZIP壓縮文件的模塊,提供創(chuàng)建、讀取、寫入和解壓功能,下面就來介紹一下Python3中使用zipfile進行文件的壓縮和解壓縮實現(xiàn),感興趣的可以了解一下
    2025-08-08
  • Python中字符串操作技巧

    Python中字符串操作技巧

    在編程中,字符串操作是一項基本技能,常見的操作包括大小寫轉(zhuǎn)換、字符串替換、倒序、統(tǒng)計、切片、切割、清理和對齊等,查找方法如find()、rfind()、index()和rindex()用于定位子串,字符串可以通過"+"號或join()方法拼接,去重技巧等,都是常見的字符串處理需求
    2024-10-10
  • Python中不安全的反序列化操作示例

    Python中不安全的反序列化操作示例

    本文給大家介紹了Python的pickling和unpickling過程,詳細解釋了如何利用pickle模塊的反序列化來執(zhí)行惡意代碼,以及如何防范這種風(fēng)險,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • python線程類改變類變量的操作代碼

    python線程類改變類變量的操作代碼

    這篇文章主要介紹了python線程類改變類變量的操作代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • python實現(xiàn)最大子序和(分治+動態(tài)規(guī)劃)

    python實現(xiàn)最大子序和(分治+動態(tài)規(guī)劃)

    這篇文章主要介紹了python實現(xiàn)最大子序和(分治+動態(tài)規(guī)劃),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python開發(fā)虛擬環(huán)境使用virtualenvwrapper的搭建步驟教程圖解

    Python開發(fā)虛擬環(huán)境使用virtualenvwrapper的搭建步驟教程圖解

    virtualenvwrapper是用來管理virtualenv的擴展包,用著很方便。這篇文章主要介紹了Python開發(fā)虛擬環(huán)境使用virtualenvwrapper的搭建步驟 ,需要的朋友可以參考下
    2018-09-09
  • Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題

    Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題

    這篇文章主要介紹了Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 淺析python字符串前加r、f、u、l 的區(qū)別

    淺析python字符串前加r、f、u、l 的區(qū)別

    這篇文章主要介紹了淺析python字符串前加r、f、u、l 的區(qū)別,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • python入門學(xué)習(xí)關(guān)于for else的特殊特性講解

    python入門學(xué)習(xí)關(guān)于for else的特殊特性講解

    本文將介紹 Python 中的" for-else"特性,并通過簡單的示例說明如何正確使用它,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評論

息烽县| 称多县| 易门县| 阿图什市| 吉木乃县| 宁乡县| 静安区| 沈丘县| 延寿县| 历史| 彭山县| 天气| 山东省| 雷山县| 当涂县| 灵台县| 台东县| 蚌埠市| 丹棱县| 英德市| 吉林省| 苏尼特左旗| 宝鸡市| 青海省| 房山区| 临安市| 遂平县| 赣州市| 和顺县| 铜川市| 许昌县| 依兰县| 策勒县| 鹤峰县| 石棉县| 石狮市| 绥棱县| 志丹县| 淅川县| 滨州市| 濉溪县|