JWT 認證 以及Django 中的應用

2022-08-21 04:00:12 字數 3363 閱讀 1264

用一套加密規則 加密和解密

rsa加密 (非對稱的加密)

私鑰 --rsa演算法-->公鑰

rsa原理

加密解密:只要你有我的公鑰你就能知道我發的訊息是什麼。

數字簽名:只要用我的公鑰把乙個訊息解密了,那麼這個訊息就一定是我發的。

小故事:公鑰、私鑰、ca認證閱讀

headers = 

# 頭部被 `base64` 編碼

header_string = base64.urlsafe_b64encode(json.dumps(headers).encode("utf-8")).replace(b'=', b'')

# 載荷(使用者資訊)

payload = 

# 載荷被 `base64` 編碼

payload_string = base64.urlsafe_b64encode(json.dumps(payload).encode("utf-8")).replace(b'=', b'')

# 簽名

# 用於加密的 字串

# 校驗 `jwt` 是否合法

# 獲取到 `token`

jwt = jwt.encode("utf-8")

# 分割 `jwt`

header_payload_string, sign_string = jwt.rsplit(b'.', 1)

header_string, payload_string = header_payload_string.split(b'.', 1)

header_data = base64.urlsafe_b64decode(header_string)

# 獲取到頭部資料

header = json.loads(header_data.decode("utf-8"))

# 獲取到載荷資料

payload = base64.urlsafe_b64decode(payload_string)

# 獲取到簽名

signature = base64.urlsafe_b64decode(sign_string)

# 獲取到簽名演算法

alg = header.get('alg')

if not alg:

print("沒有演算法")

raise valueerror("alg is not null")

secret = "+&0p1d$l$lq%xm0qvet0i++!p-*e1ql*5t!kajgjm$fe_ycf1n".encode("utf-8")

if not hmac.compare_digest(

signature, hmac.new(secret, header_payload_string, hashlib.sha256).digest()

):print("驗證失敗")

raise valueerror("驗證簽名失敗")

print("驗證通過")

payload_dic = json.loads(payload.decode("utf-8"))

print(payload_dic)

# 過期時間校驗

if not payload_dic.get("exp") > int(time.time()):

raise valueerror("jwt過期了")

from django.contrib.auth.models import user

return user.objects.get(pk=payload_dic.get("user_id")), none

# 用模組生成

# 秘鑰

secret = "+&0p1d$l$lq%xm0qvet0i++!p-*e1ql*5t!kajgjm$fe_ycf1n"

expire_time = int(time.time() + 1) # 1 小時後超時

# 生成 gwt

encoded = jwt.encode(

# header 金鑰 編碼方式

, secret.encode("utf8"), algorithm='hs256')

encoded_str = str(encoded, encoding='utf-8')

print(encoded_str)

time.sleep(2)

# 解碼

info = jwt.decode(encoded_str, secret, algorithm='hs256')

print(info)

也可以 使用 django 自帶的 jwt

在 serializer 序列化器 中 的validata(self, data)函式中 獲取request物件

並在物件中 獲取 請求頭 也就是 jwt 的 字串

def validata(self, data):

# 獲取 request 物件

request = self.context.get('request')

# 獲取請求頭 也就是 jwt

JWT在Django中的應用

json web token jwt 是為了在網路應用環境間傳遞宣告而執行的一種基於json的開放標準 rfc 7519 該token被設計為緊湊且安全的,特別適用於分布式站點的單點登入 sso 場景。jwt的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取...

DRF的JWT使用者認證

目錄jwt的使用 從根本上來說,jwt是一種開放的標準 rfc 7519 全稱為json web token 其存在的意義在於,對於前後端分離的專案來說,後端不需要儲存token,主需要儲存簽發和校驗token的演算法,所以我們需要在前端儲存token,然後通過jwt加密之後傳送給後端,從而完成校驗...

Django中的登入認證

django中已經封裝好了後端的認證功能authenticate 1 django rest framework jwt提供了登入簽發jwt的檢視,可以直接使用 驗證使用者名稱和密碼,驗證成功後,為使用者簽發jwt,前端將簽發的jwt儲存下來。登入流程為 查詢使用者資料,將查詢到的資料和使用者輸入的...