新聞中心
這篇文章主要介紹django中如何配置jwt的token認(rèn)證,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)隴南免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1. jwt簡介
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
2. jwt構(gòu)成
jwt就是一段字符串, 由三段信息構(gòu)成的, 將這三段信息文本用. 鏈接在一起就構(gòu)成了jwt字符串, 就像這樣:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
第一部分我們稱它為頭部(header), 第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品), 第三部分是簽證(signature).
header
jwt的頭部承載兩部分信息:
a. 聲明類型, 這里是jwt
b. 聲明加密的算法,通常直接使用 HMAC SHA256
完整的頭部就像下面這樣的JSON:
{
'typ': 'JWT',
'alg': 'HS256'
}然后將頭部進(jìn)行base64加密(該加密是可以對稱解密的), 構(gòu)成了第一部分
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload
載荷就是存放有效信息的地方, 這個名字像是特指承載的貨品, 這些有效信息包含三部分
a. 標(biāo)準(zhǔn)中注冊的聲明
b. 公共的聲明
c. 私有的聲明
標(biāo)準(zhǔn)中注冊的聲明(建議但不強(qiáng)制使用)
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間, 這個過期時間必須要大于簽發(fā)時間
nbf: 定義在什么時間之前, 該jwt都是不可用的
iat: jwt的簽發(fā)時間
jti: jwt的唯一身份標(biāo)識, 主要用來作為一次性token, 從而回避重放***.
公共的聲明:
公共的聲明可以添加任何的信息, 一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息, 但不建議添加敏感信息, 因為該部分在客戶端可解密
私有的聲明:
私有聲明是提供者和消費者所共同定義的聲明, 一般不建議存放敏感信息, 因為base64是對稱解密的, 意味著該部分信息可以歸類為明文信息
定義一個payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}signature
JWT的第三部分是一個簽證信息,這個簽證信息由三部分組成:
header (base64后的)
payload (base64后的)
secret
這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進(jìn)行加鹽secret組合加密,然后就構(gòu)成了jwt的第三部分。
// javascript var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload); var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
將這三部分用.連接成一個完整的字符串,構(gòu)成了最終的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意:secret是保存在服務(wù)器端的,jwt的簽發(fā)生成也是在服務(wù)器端的,secret就是用來進(jìn)行jwt的簽發(fā)和jwt的驗證,所以,它就是你服務(wù)端的私鑰,在任何場景都不應(yīng)該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。
django-rest-framework-jw文檔網(wǎng)站
安裝配置JWT
1. 安裝
pip install djangorestframework-jwt
2. 在配置文件dev.py中增加以下內(nèi)容:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}JWT_EXPIRATION_DELTA 指明token的有效期
3. Django REST framework JWT 擴(kuò)展的說明文檔中提供了手動簽發(fā)JWT的方法
from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload)
在用戶注冊或者登錄成功后, 在序列化器中返回用戶信息以后同時返回token即可
4. Django REST framework JWT提供了登錄獲取token的視圖,可以直接使用
在子路由中, 配置路由:
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]5. 在主路由中, 引入當(dāng)前子應(yīng)用的路由文件
urlpatterns = [
path('users/', include("users.urls")),
# include 的值必須是模塊名.urls格式, 字符串中間只能出現(xiàn)一個圓點
]以上是“django中如何配置jwt的token認(rèn)證”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:django中如何配置jwt的token認(rèn)證
本文鏈接:http://www.dlmjj.cn/article/jocpdc.html


咨詢
建站咨詢
