成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:分布式系統的低成本權限校驗機制

云計算 分布式
當然JWT并不能完全替代Session。因為Session可以實時控制用戶的權限和行為。例如網站要做一個單點登錄,用戶在A瀏覽器登錄,就會自動在B瀏覽器登出。這個功能單獨使用JWT就做不到。

經常關注未聞Code的同學都知道,我做了一個叫做GNE[1]的開源項目,它能夠自動提取新聞類網頁的正文。效果遠遠好于市面上其他的開源新聞提取工具。

大家可能不知道,GNE還有一個高級版,叫做GnePro。它可以讓你輸入URL就自動提取新聞的正文,提取的字段比GNE多得多。并且已經在8個國家13萬個網站上做過測試,識別準確率100%。

GnePro是使用K8S搭建的爬蟲集群。背后有幾十臺服務器,通過一個網關做負載均衡。在設計GnePro權限機制的時候,我希望它能夠盡量簡單,盡量不依賴第三方的組件。

常規的權限校驗機制一般是這樣的,用戶登錄以后,在Cookies里面會有一個SessionId.當用戶要查詢數據時,往后端發起請求。后端從請求中拿到這個SessionId,到Redis或者其他數據庫中,查詢到這個用戶的Session。在Session中,儲存了用戶的一些登錄信息和權限信息。再根據這個權限信息返回用戶有權限的內容。

但這個方法需要額外引入Redis或者其他的數據庫。那么這就面臨著數據同步,并發沖突等等問題。

我的需求很簡單,只需要知道用戶的賬戶什么時候過期,用戶是什么等級就可以了。V1等級只能返回新聞正文,標題,發布時間,作者,圖片。V2在V1的基礎上,還可以返回面包屑,SEO數據,網頁標簽,支持JavaScript渲染。V3還可以返回經過清洗的網頁正文源代碼,支持用戶上傳HTML進行解析。因此,我不使用Session,而是使用JWT來實現。

這種情況下,使用JWT非常合適。JWT不需要引入第三方的組件。任何一個服務器都能獨立進行權限校驗。

例如,我定義一個數據結構,注明了用戶現在是什么等級,這次授權什么時候過期:

user_info = {  
    'level': 'v2',  
    'expire': '2023-12-01 00:00:00',  
    'name': '青南'  
}

在Python中,使用PyJWT就能非常方便地生成JWT Token。首先使用pip安裝PyJWT:

python3 -m pip install pyjwt

然后3行代碼生成Token:

import jwt  
  
  
user_info = {  
    'level': 'v1',  
    'expire': '2023-12-01 00:00:00',  
    'name': '青南'  
}  
  
password = '青南工資9999999999'  
  
token = jwt.encode(user_info, password, algorithm='HS256')  
print(token)

如下圖所示:

圖片圖片

經常寫爬蟲的同學,可能對這個eyJh開頭的字符串很熟悉,很多網站的Headers里面都有長成這樣的Token。

當一個用戶在我這里充值了會員以后,我就生成一個token發給他。當他使用GnePro發起請求時,把這個Token放到Headers就可以了。

我的后端收到請求以后,無論當前在哪個服務器上面,只需要執行下面幾行代碼,就能解析出用戶權限信息:

import jwt  
  
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6InYxIiwiZXhwaXJlIjoiMjAyMy0xMi0wMSAwMDowMDowMCIsIm5hbWUiOiJcdTk3NTJcdTUzNTcifQ.8xEkWL1pbtHKMXjrVsTtiY4JZnSMf--ufK3fiDp67SY'  
password = '青南工資9999999999'  
  
user_info = jwt.decode(token, password, algorithms=['HS256'])  
print(user_info)

運行效果如下圖所示:

圖片圖片

需要注意的是,這個JWT Token看起來這么長一串,就跟密碼一樣,但其實我們可以直接使用Jwt.io[2]這個網站進行解析,如下圖所示:

圖片圖片

解析JWT Token是不需要密碼的。但是生成/修改JWT Token需要密碼。如果密碼不正確,就會生成另外一個JWT Token:

圖片圖片

這個Token雖然跟我剛剛生成的非常像,但是由于密碼不對,我這邊進行校驗的時候就會報錯:

圖片圖片

因此,我生成這個Token以后,我并不擔心用戶會把level改成v3。因為他沒有我的密碼,他生成的Token在我這里通不過驗證。我就能知道這個Token是否被篡改過。

整個校驗過程只需要幾行代碼,不需要任何第三方組件。完美符合少即是多的原則。

當然JWT并不能完全替代Session。因為Session可以實時控制用戶的權限和行為。例如網站要做一個單點登錄,用戶在A瀏覽器登錄,就會自動在B瀏覽器登出。這個功能單獨使用JWT就做不到。

有人可能會說,你在JWT的信息里面加個SessionId不就好了嗎。后端讀到SessionId對應的信息,就可以進行更多操作了。

但這樣做,跟直接在Cookies里面放SessionId有什么區別?JWT本來就是在輕量級的權限校驗里面使用的。它有適合自己的場景。不需要成為Session。大家也不要把JWT當Session用。

參考資料

[1]GNE: https://github.com/GeneralNewsExtractor/GeneralNewsExtractor

責任編輯:武曉燕
相關推薦

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2022-06-26 00:29:26

分布式系統Redis

2021-10-15 21:08:31

PandasExcel對象

2022-06-28 09:31:44

LinuxmacOS系統

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監控

2022-03-12 20:38:14

網頁Python測試

2025-05-28 03:15:00

Scrapy數據sleep

2021-04-12 21:19:01

PythonMakefile項目

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-09-13 20:38:47

Python鏈式調用

2021-03-12 21:19:15

Python鏈式調用

2024-07-30 08:11:16

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:16:18

Python代碼工具

2024-11-11 00:38:13

Mypy靜態類型

2021-10-03 20:08:29

HTTP2Scrapy

2024-05-24 09:07:06

JSONprint字符串

2021-05-08 19:33:51

移除字符零寬

2021-07-27 21:32:57

Python 延遲調用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看一区二区 | 日韩影音| 国产精品久久久久久久久久久久冷 | 99久久亚洲 | 美女黄网站视频免费 | 国产成人自拍一区 | 国产精品一区二区在线 | 精品国产乱码久久久久久88av | 国产精品视频免费观看 | 免费能直接在线观看黄的视频 | 日韩免费视频 | 国产女人叫床高潮大片免费 | 美女精品一区 | 国产一区二区免费 | 国产精品久久久久久久久久久久久 | 国产福利在线播放 | 欧美激情一区二区三级高清视频 | 在线观看国产视频 | 98成人网 | 亚洲成人在线免费 | 一级电影免费看 | 国产精品无码专区在线观看 | 女同久久 | 91中文| 中文字幕在线观看www | 国产精品jizz在线观看老狼 | 国产乱码精品一品二品 | 国产精品成人久久久久 | 欧美成人一区二区 | 国产传媒毛片精品视频第一次 | 亚洲高清视频在线观看 | 久久久久国产一区二区三区 | 国产精品成人一区二区三区吃奶 | 成人在线一区二区三区 | 成年人在线视频 | 一区二区三区精品视频 | 日韩人体在线 | 2019天天操 | 麻豆久久久久久久 | 亚洲一区二区三区视频免费观看 | 激情一区二区三区 |