日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
JWT的Token過(guò)期時(shí)間為什么沒(méi)有生效

在我第一次在 DRF(Django REST Framework)中使用 JWT 時(shí),感覺(jué) JWT 非常神奇,它即沒(méi)有使用 session、cookie,也不使用數(shù)據(jù)庫(kù),僅靠一段加密的字符串,就解決了用戶身份驗(yàn)證的煩惱。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供文峰企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為文峰眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

直到我遇到了一個(gè)當(dāng)時(shí)百思不得解的問(wèn)題,才揭開(kāi)了它的神秘面紗。

當(dāng)時(shí)遇到的問(wèn)題就是,無(wú)論怎么設(shè)置 JWT TOKEN 的過(guò)期時(shí)間,都沒(méi)有生效,即使設(shè)置為 1 秒后過(guò)期,過(guò)了 1 分鐘,TOKEN 還是可以正常使用,重啟 Django 服務(wù)也不行。

沒(méi)有別的辦法,我就硬著頭皮去追著源碼,看看 JWT 是怎么判斷 TOKEN 是否過(guò)期的。

具體的方法就是,深度優(yōu)先追溯 JWT 代碼的源頭。在 DRF 中,配置了 DEFAULT_AUTHENTICATION_CLASSES 就是 JWT:

直接定位至這個(gè)類,發(fā)現(xiàn)它繼承了 BaseJSONWebTOKENAuthentication

然后看 BaseJSONWebTOKENAuthentication,發(fā)現(xiàn)有一段判斷過(guò)期的邏輯:

繼續(xù)展開(kāi) jwt_decode_handler 這個(gè)函數(shù),發(fā)現(xiàn)它調(diào)用了 jwt.decode 函數(shù)

展開(kāi) jwt.decode 函數(shù),發(fā)現(xiàn)它調(diào)用了函數(shù) _validate_claims

函數(shù) _validate_claims 又調(diào)用了 _validate_exp,

然后展開(kāi) _validate_exp,找到了這段:

發(fā)現(xiàn)過(guò)期時(shí)間 exp 來(lái)自 payload,payload 又來(lái)自 TOKEN 本身:

至此謎底揭開(kāi),原來(lái),TOKEN 的過(guò)期時(shí)間其實(shí)被編碼在了 TOKEN 本身,服務(wù)器收到 TOKEN 時(shí)先進(jìn)行解碼,解碼出過(guò)期時(shí)間,然后和當(dāng)前時(shí)間進(jìn)行對(duì)比,如果當(dāng)前時(shí)間比較小,說(shuō)明沒(méi)有過(guò)期,TOKEN 就是有效的,否則返回客戶端 "Signature has expired."

我 Debug 出了這個(gè) TOKEN 的過(guò)期時(shí)間 exp,發(fā)現(xiàn)這個(gè) exp 是修改 JWT_EXPIRATION_DELTA 之前的那個(gè)過(guò)期時(shí)間,原來(lái)修改 JWT_EXPIRATION_DELTA 之后需要重新生成 TOKEN,這樣的過(guò)期時(shí)間才會(huì)按照新的來(lái)。

至此,JWT 的原理已經(jīng)非常清晰了:

用戶第一次登錄時(shí),服務(wù)器(JWT)會(huì)獲得用戶名、用戶 id,在加上設(shè)置的過(guò)期時(shí)間構(gòu)建 payload:

 
 
 
 
  1. payload = {
  2.         'user_id': user.pk,
  3.         'username': username,
  4.         'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
  5.     }

然后將 payload 用設(shè)置好的算法使用私鑰加密成 token

 
 
 
 
  1. def jwt_encode_handler(payload):
  2.     key = api_settings.JWT_PRIVATE_KEY or jwt_get_secret_key(payload)
  3.     return jwt.encode(
  4.         payload,
  5.         key,
  6.         api_settings.JWT_ALGORITHM
  7.     ).decode('utf-8')

token 返回至客戶端后,客戶端緩存該 token,然后每一次請(qǐng)求時(shí)都帶上該 token。

服務(wù)器在收到請(qǐng)求時(shí)先驗(yàn)證該 token,驗(yàn)證的過(guò)程就是對(duì) token 進(jìn)行逆向解碼:

 
 
 
 
  1. def jwt_decode_handler(token):
  2.     options = {
  3.         'verify_exp': api_settings.JWT_VERIFY_EXPIRATION,
  4.     }
  5.     # get user from token, BEFORE verification, to get user secret key
  6.     unverified_payload = jwt.decode(token, None, False)
  7.     secret_key = jwt_get_secret_key(unverified_payload)
  8.     return jwt.decode(
  9.         token,
  10.         api_settings.JWT_PUBLIC_KEY or secret_key,
  11.         api_settings.JWT_VERIFY,
  12.         options=options,
  13.         leeway=api_settings.JWT_LEEWAY,
  14.         audience=api_settings.JWT_AUDIENCE,
  15.         issuer=api_settings.JWT_ISSUER,
  16.         algorithms=[api_settings.JWT_ALGORITHM]
  17.     )

解密使用同樣的算法,使用公鑰或私鑰進(jìn)行解密,解密成功且不過(guò)期,則認(rèn)為用戶有權(quán)限訪問(wèn),正常返回。

最后

這個(gè)問(wèn)題至少花了我半個(gè)小時(shí)的時(shí)間,如果你遇到這種情況,能瞬間明白其中緣由,那本文的目的就達(dá)到了。

源碼之下無(wú)秘密,遇到問(wèn)題,去看源碼可能不是解決問(wèn)題最快的方法,卻是提升自己最快的方法。很多開(kāi)源軟件設(shè)計(jì)模式的應(yīng)用都非常值得我們學(xué)習(xí),比如 DRF 的模塊設(shè)計(jì),通過(guò) mixins 組合來(lái)實(shí)現(xiàn)靈活可擴(kuò)展的 APIView,通過(guò)子類傳入相關(guān)的 class 來(lái)實(shí)現(xiàn)用戶自定義的功能。如何寫(xiě)出靈活可擴(kuò)展、高內(nèi)聚低耦合、符合開(kāi)閉原則的程序,閱讀開(kāi)源代碼,是一個(gè)非常高效的學(xué)習(xí)方式。

當(dāng)然了,這需要先對(duì)設(shè)計(jì)模式有一個(gè)系統(tǒng)的學(xué)習(xí),讓自己有一雙慧眼,不然就是守著金山不自知。

本文轉(zhuǎn)載自微信公眾號(hào)「Python七號(hào)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python七號(hào)公眾號(hào)。


分享名稱:JWT的Token過(guò)期時(shí)間為什么沒(méi)有生效
當(dāng)前地址:http://www.5511xx.com/article/dhopsji.html