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

一日一技:分布式系統(tǒng)的低成本權(quán)限校驗(yàn)機(jī)制

云計(jì)算 分布式
當(dāng)然JWT并不能完全替代Session。因?yàn)镾ession可以實(shí)時(shí)控制用戶的權(quán)限和行為。例如網(wǎng)站要做一個(gè)單點(diǎn)登錄,用戶在A瀏覽器登錄,就會(huì)自動(dòng)在B瀏覽器登出。這個(gè)功能單獨(dú)使用JWT就做不到。

經(jīng)常關(guān)注未聞Code的同學(xué)都知道,我做了一個(gè)叫做GNE[1]的開源項(xiàng)目,它能夠自動(dòng)提取新聞?lì)惥W(wǎng)頁的正文。效果遠(yuǎn)遠(yuǎn)好于市面上其他的開源新聞提取工具。

大家可能不知道,GNE還有一個(gè)高級(jí)版,叫做GnePro。它可以讓你輸入U(xiǎn)RL就自動(dòng)提取新聞的正文,提取的字段比GNE多得多。并且已經(jīng)在8個(gè)國家13萬個(gè)網(wǎng)站上做過測(cè)試,識(shí)別準(zhǔn)確率100%。

GnePro是使用K8S搭建的爬蟲集群。背后有幾十臺(tái)服務(wù)器,通過一個(gè)網(wǎng)關(guān)做負(fù)載均衡。在設(shè)計(jì)GnePro權(quán)限機(jī)制的時(shí)候,我希望它能夠盡量簡(jiǎn)單,盡量不依賴第三方的組件。

常規(guī)的權(quán)限校驗(yàn)機(jī)制一般是這樣的,用戶登錄以后,在Cookies里面會(huì)有一個(gè)SessionId.當(dāng)用戶要查詢數(shù)據(jù)時(shí),往后端發(fā)起請(qǐng)求。后端從請(qǐng)求中拿到這個(gè)SessionId,到Redis或者其他數(shù)據(jù)庫中,查詢到這個(gè)用戶的Session。在Session中,儲(chǔ)存了用戶的一些登錄信息和權(quán)限信息。再根據(jù)這個(gè)權(quán)限信息返回用戶有權(quán)限的內(nèi)容。

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

我的需求很簡(jiǎn)單,只需要知道用戶的賬戶什么時(shí)候過期,用戶是什么等級(jí)就可以了。V1等級(jí)只能返回新聞?wù)模瑯?biāo)題,發(fā)布時(shí)間,作者,圖片。V2在V1的基礎(chǔ)上,還可以返回面包屑,SEO數(shù)據(jù),網(wǎng)頁標(biāo)簽,支持JavaScript渲染。V3還可以返回經(jīng)過清洗的網(wǎng)頁正文源代碼,支持用戶上傳HTML進(jìn)行解析。因此,我不使用Session,而是使用JWT來實(shí)現(xiàn)。

這種情況下,使用JWT非常合適。JWT不需要引入第三方的組件。任何一個(gè)服務(wù)器都能獨(dú)立進(jìn)行權(quán)限校驗(yàn)。

例如,我定義一個(gè)數(shù)據(jù)結(jié)構(gòu),注明了用戶現(xiàn)在是什么等級(jí),這次授權(quán)什么時(shí)候過期:

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)

如下圖所示:

圖片圖片

經(jīng)常寫爬蟲的同學(xué),可能對(duì)這個(gè)eyJh開頭的字符串很熟悉,很多網(wǎng)站的Headers里面都有長成這樣的Token。

當(dāng)一個(gè)用戶在我這里充值了會(huì)員以后,我就生成一個(gè)token發(fā)給他。當(dāng)他使用GnePro發(fā)起請(qǐng)求時(shí),把這個(gè)Token放到Headers就可以了。

我的后端收到請(qǐng)求以后,無論當(dāng)前在哪個(gè)服務(wù)器上面,只需要執(zhí)行下面幾行代碼,就能解析出用戶權(quán)限信息:

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

運(yùn)行效果如下圖所示:

圖片圖片

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

圖片圖片

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

圖片圖片

這個(gè)Token雖然跟我剛剛生成的非常像,但是由于密碼不對(duì),我這邊進(jìn)行校驗(yàn)的時(shí)候就會(huì)報(bào)錯(cuò):

圖片圖片

因此,我生成這個(gè)Token以后,我并不擔(dān)心用戶會(huì)把level改成v3。因?yàn)樗麤]有我的密碼,他生成的Token在我這里通不過驗(yàn)證。我就能知道這個(gè)Token是否被篡改過。

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

當(dāng)然JWT并不能完全替代Session。因?yàn)镾ession可以實(shí)時(shí)控制用戶的權(quán)限和行為。例如網(wǎng)站要做一個(gè)單點(diǎn)登錄,用戶在A瀏覽器登錄,就會(huì)自動(dòng)在B瀏覽器登出。這個(gè)功能單獨(dú)使用JWT就做不到。

有人可能會(huì)說,你在JWT的信息里面加個(gè)SessionId不就好了嗎。后端讀到SessionId對(duì)應(yīng)的信息,就可以進(jìn)行更多操作了。

但這樣做,跟直接在Cookies里面放SessionId有什么區(qū)別?JWT本來就是在輕量級(jí)的權(quán)限校驗(yàn)里面使用的。它有適合自己的場(chǎng)景。不需要成為Session。大家也不要把JWT當(dāng)Session用。

參考資料

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

責(zé)任編輯:武曉燕
相關(guān)推薦

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2022-06-26 00:29:26

分布式系統(tǒng)Redis

2021-10-15 21:08:31

PandasExcel對(duì)象

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監(jiān)控

2022-03-12 20:38:14

網(wǎng)頁Python測(cè)試

2025-05-28 03:15:00

Scrapy數(shù)據(jù)sleep

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具

2021-04-19 23:29:44

MakefilemacOSLinux

2024-11-11 00:38:13

Mypy靜態(tài)類型

2024-05-24 09:07:06

JSONprint字符串

2021-07-27 21:32:57

Python 延遲調(diào)用

2021-10-03 20:08:29

HTTP2Scrapy

2021-05-08 19:33:51

移除字符零寬
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一二三区在线 | 免费观看成人av | 国产精品一区二区不卡 | 亚洲理论在线观看电影 | 成人美女免费网站视频 | 亚洲区视频 | 久久国产成人精品国产成人亚洲 | 一区二区视频在线 | 日韩欧美理论片 | 国产午夜精品视频 | 国产探花在线精品一区二区 | 国产精品久久国产愉拍 | 成人免费视频观看视频 | 日本成人在线观看网站 | 91免费观看国产 | 成人在线一区二区三区 | 国产精品亚洲视频 | 国产综合av | 国产95在线 | 黄色中文字幕 | 日日淫 | 精品不卡 | 免费看一级毛片 | 在线中文字幕视频 | 毛片免费在线 | 日韩一区二区免费视频 | av资源在线看 | 久久逼逼 | 久久黄色网 | 国产精品96久久久久久 | 国产精品毛片久久久久久久 | 久草.com| 国产视频第一页 | 91精品国产综合久久婷婷香蕉 | 欧美日韩久久精品 | 国产精品一区一区 | 国产精品一二三区 | 国产精品1区 | 狠狠干网站 | 伊人在线视频 | 日本三级日产三级国产三级 |