django應(yīng)用JWT(JSON?Web?Token)實(shí)戰(zhàn)教程
在前后端分離的項(xiàng)目中,前后端進(jìn)行身份驗(yàn)證通常用JWT來進(jìn)行,JWT 提供了一個(gè)理想的認(rèn)證解決方案,用來保護(hù) RESTful API,確保只有經(jīng)過認(rèn)證的用戶才能訪問受保護(hù)的資源?;谇岸丝蚣埽ㄈ鏡eact, Angular, Vue.js)的單頁面應(yīng)用 (SPA),開發(fā)者通過使用 JWT可以獲得一種簡(jiǎn)單、安全、高效的方式來處理用戶認(rèn)證和授權(quán)的問題。本文通過django項(xiàng)目的實(shí)戰(zhàn)來說明如何應(yīng)用和使用JWT。
一、什么是JWT
JWT(JSON Web Token)是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)各方之間以安全且緊湊的形式傳輸信息。JWT 是一個(gè)小型的憑證,通常用于身份驗(yàn)證和授權(quán)場(chǎng)景。JWT 由三部分組成:頭部 (Header)、負(fù)載 (Payload) 和簽名 (Signature)。
JWT信息由3段構(gòu)成,它們之間用圓點(diǎn)“.”連接,格式如下:
aaaaaa.bbbbbb.cccccc
一個(gè)典型的JWT如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI2OTcyMDc2LCJpYXQiOjE3MjY5NzAyNzYsImp0aSI6IjMyMTFiZjdmZDlhZTRmNTBhMDNmOGM2NjcwNDM2NjFiIiwidXNlcl9pZCI6Mn0.Ej6US4Uk-sSNm9P8kTU_cDAzBpO4I-BLhPstp5sG00Q
- 頭部 (Header):包含了關(guān)于 JWT 類型的信息以及所使用的簽名算法。
- 負(fù)載 (Payload):是 JWT 的主體部分,包含了實(shí)際需要聲明的數(shù)據(jù)。這些數(shù)據(jù)通常包括用戶ID、用戶名、角色等信息。
- 簽名 (Signature):用于驗(yàn)證 JWT 的發(fā)送者就是它聲稱的發(fā)送者,同時(shí)也確保了 JWT 在傳輸過程中沒有被篡改。
二、為什么使用JWT
使用 JWT 的原因主要有以下幾點(diǎn):
- 安全性:JWT 通過簽名來保證數(shù)據(jù)的完整性和防篡改性。如果有人試圖修改 JWT 內(nèi)容,簽名會(huì)失效,接收方可以檢測(cè)到這一行為。
- 無狀態(tài)性:JWT 是自包含的,這意味著不需要在服務(wù)器上保存會(huì)話狀態(tài)。每個(gè) JWT 都包含了所有必要的信息,從而減少了對(duì)服務(wù)器端存儲(chǔ)的需求。
- 跨域支持:JWT 可以輕松地在不同的域之間共享,這使得它非常適合微服務(wù)架構(gòu)和分布式系統(tǒng)。
- 性能提升:由于 JWT 是自包含的,所以服務(wù)器可以快速地驗(yàn)證 JWT,而無需查詢數(shù)據(jù)庫(kù)來獲取用戶信息,這提高了應(yīng)用的響應(yīng)速度。
- 易于緩存和擴(kuò)展:JWT 可以被緩存,并且因?yàn)樗鼈兪菬o狀態(tài)的,所以可以很容易地?cái)U(kuò)展到多個(gè)服務(wù)器,而無需擔(dān)心會(huì)話復(fù)制問題。CSRF 防護(hù):使用 JWT 可以幫助緩解跨站請(qǐng)求偽造(CSRF)攻擊的風(fēng)險(xiǎn),因?yàn)?JWT 不依賴于 cookie,也就不會(huì)隨同 HTTP 請(qǐng)求自動(dòng)發(fā)送。
總的來說,JWT 提供了一種高效、安全的方式來處理用戶認(rèn)證和授權(quán),尤其是在需要跨域操作或構(gòu)建無狀態(tài)服務(wù)的情況下。
三、在django項(xiàng)目中如何應(yīng)用JWT
JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)應(yīng)用中安全地傳輸信息的令牌。它通常用于身份驗(yàn)證和授權(quán),特別是在單頁應(yīng)用(SPA)和API服務(wù)中。在Django中應(yīng)用JWT,可以使用 djangorestframework-simplejwt。
1、安裝djangorestframework-simplejwt庫(kù):
pip install djangorestframework-simplejwt
2、在settings.py中配置JWT認(rèn)證:
在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', # 注冊(cè)條件查詢 'mdeditor', # 注冊(cè)markdown的應(yīng)用 'drf_yasg2', # 接口文檔 ]
添加REST_FRAMEWORK的默認(rèn)認(rèn)證類為JWT認(rèn)證
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), # 訪問令牌的有效時(shí)間 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 刷新令牌的有效時(shí)間 'ROTATE_REFRESH_TOKENS': False, # 是否允許刷新令牌循環(huán) 'BLACKLIST_AFTER_ROTATION': True, # 刷新令牌后是否加入黑名單 'UPDATE_LAST_LOGIN': False, # 登錄時(shí)是否更新最后登錄時(shí)間 'ALGORITHM': 'HS256', # 簽名算法 'SIGNING_KEY': SECRET_KEY, # 簽名密鑰 'VERIFYING_KEY': None, # 驗(yàn)證密鑰 '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',), # 認(rèn)證令牌類 'TOKEN_TYPE_CLAIM': 'token_type', # 令牌類型聲明 'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', # 滑動(dòng)令牌刷新過期聲明 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), # 滑動(dòng)令牌有效時(shí)間 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), # 滑動(dòng)令牌刷新有效時(shí)間 }
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、在視圖中需要認(rèn)證的地方使用JWT認(rèn)證
如下modelviweset中使用,對(duì)于查詢方法如list,retrieve不做鑒權(quán),對(duì)于其他方法需要鑒權(quán)。
def get_permissions(self): """ Instantiates and returns the list of permissions that this view requires. """ if self.action in ['list', 'retrieve']: # 對(duì)于list方法,返回AllowAny權(quán)限類,表示不需要鑒權(quán) permission_classes = [AllowAny, ] else: # 對(duì)于其他方法,返回IsAuthenticated權(quán)限類,表示需要用戶已認(rèn)證 permission_classes = [IsAuthenticated, ] return [permission() for permission in permission_classes]
四、JWT如何使用
通過上面的應(yīng)用后,使用接口調(diào)用遇到需要鑒權(quán)的會(huì)提示需要認(rèn)證。
如當(dāng)我們調(diào)用刪除接口時(shí),如果沒有獲得鑒權(quán),接口會(huì)返回需要認(rèn)證的信息。
那如何通過JWT進(jìn)行認(rèn)證呢?
下面通過postman來應(yīng)用JWT的使用過程。
1、調(diào)用生成JWT的接口獲取JWT
2、客戶端保存JWT在調(diào)用接口時(shí)帶上獲取的JWT
至此,本文介紹了什么時(shí)JWT,為什么要使用JWT,通過django實(shí)現(xiàn)JWT,介紹了JWT的使用流程,最后以一個(gè)具體API接口實(shí)例的調(diào)用來說明JWT如何使用。后續(xù)將介紹VUE從前端登錄獲取JWT到JWT認(rèn)證的實(shí)例。
參考資料:http://xiejava.ishareread.com/
到此這篇關(guān)于django應(yīng)用JWT(JSON Web Token)實(shí)戰(zhàn)教程的文章就介紹到這了,更多相關(guān)django應(yīng)用JWT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)可視化教程之Matplotlib實(shí)現(xiàn)各種圖表實(shí)例
這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)可視化教程之利用Matplotlib實(shí)現(xiàn)各種圖表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2019-01-01編寫Python腳本來實(shí)現(xiàn)最簡(jiǎn)單的FTP下載的教程
這篇文章主要介紹了編寫Python腳本來實(shí)現(xiàn)最簡(jiǎn)單的FTP下載的教程,主要用到了ftplib模塊,無圖形界面...需要的朋友可以參考下2015-05-05Python特性之列表推導(dǎo)式和生成器表達(dá)式詳解
這篇文章主要介紹了python語言的兩個(gè)非常有用的特性:列表推導(dǎo)式和生成器表達(dá)式,但是它們之間也有一些重要的區(qū)別,我們一起來看看吧2023-08-08Windows系統(tǒng)Python直接調(diào)用C++ DLL的方法
這篇文章主要介紹了Windows系統(tǒng)Python直接調(diào)用C++ DLL文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法
這篇文章主要介紹了Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法,比較實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08Pandas統(tǒng)計(jì)重復(fù)的列里面的值方法
今天小編就為大家分享一篇Pandas統(tǒng)計(jì)重復(fù)的列里面的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01基于Python socket的端口掃描程序?qū)嵗a
這篇文章主要介紹了基于Python socket的端口掃描程序?qū)嵗a,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02封裝Detours用于Python中x64函數(shù)hook詳解
Detours是微軟發(fā)布的一個(gè)API hook框架,同時(shí)支持x86和x64,看文檔說也支持ARM和ARM64的Windows,這篇文章主要介紹了封裝Detours用于Python中x64函數(shù)hook,需要的朋友可以參考下2023-12-12