jwt oauth2和oidc等認證授權技術的理解

2021-09-28 07:30:55 字數 3188 閱讀 1421

jwt、oauth2、oidc等,都是和認證授權相關的規範或者解決方案,因此要理解他們,就需要從業務場景的適用性一步步的分析和認識。

就個人目前的理解來看,乙個好的軟體系統的構成可能需要包含但不限於以下幾個方面:

功能

效能拓展

安全

不論是從公司或者專案角度而言,還是從個人開發者的角度而言,有相當大一部分可能都只在功能部分停留。

何謂功能,我的理解就是實現業務需求裡的要求,滿足需求文件需要的效果,流程走通、可交付使用。因此這裡說的功能,和僅僅是流程走通還是有一定區別的。

在功能的基礎上,有的客戶可能在需求裡就對一些效能有要求,或者有些公司的專案團隊有一定追求,那麼可能就更進一步,會在功能的基礎上再注重效能。

那麼這裡的效能就會涉及到整個架構的設計、技術的選型以及**的規範和調優。

至於拓展性,實際上和上邊一條就有些類似了,不論是動機還是處理方式都差不多。

只不過在分布式、微服務和容器盛行的今天,很多專案的第一選擇就是這兩個,那麼在架構層面來說,其實一開始就具備了一定的拓展性。

而說到安全,很多人第一時間想到的可能是使用者名稱密碼這些,這也是最常見到的安全裡的內容。

但是實際上軟體的安全遠遠不止使用者名稱密碼的管理和校驗,還包含資料傳輸的安全、資源許可權的安全等。

而標題所說的認證授權,也正是安全範疇裡的內容,更確切的說,應該是資源許可權控制的範疇。

token這個詞,很多做開發的應該都知道,比較常見的就是在使用者名稱密碼登陸後,後台生成乙個token,然後客戶端儲存token。

客戶端只有獲取了正確的token後,在發起業務請求時攜帶這個token,才能正常進行後續的業務處理。

那麼這個token既然是為了保證安全、用來校驗使用者是否登入的,token本身的安全自然也是需要注意的,所以一般的token就有了簽名加密的處理。

而至於token裡的內容定義以及格式定義,理論上講只需要客戶端和服務端協商一致即可。

但是考慮到token的通用性和廣泛性,因此慢慢的就有了一些token定義的規範,乙個目前比較通用的token規範就是jwt。

jwt是json web token的簡稱,標準的jwt格式token包含了三段,分別是token頭、token主題和token簽名,三部分以點符號分割。

jwt作為一種規範,也可以說一種解決方案,本身就可以拿出來做很多的解讀,更多jwt的知識可以參考阮一峰的部落格:

對於認證授權來說,只需要先了解到這個jwt是一種通用規範和格式的資料,安全、通用就好。

jwt是一種token規範,那麼在使用者登入的時候,就可以生成這種規範的token,這樣在後續解碼、簽名驗籤、資料處理等需求上就可以減少很多的溝通成本。

但是jwt只是處理token規範的問題,卻不處理其他token規範之外業務的問題,比如token如何能方便重新整理的問題,比如究竟是簡單地登入業務,還是涉及到第三方服務的授權業務,還是帶有授權和認證的業務等等。

而這個問題,就引申出了oauth2。

要想弄清oauth2,實際上必須先弄清認證和授權這兩個概念。

從英語單詞來看,認證和授權其實非常的像,分別是 authentication 和 authorization,在實際開發中,很多人也不太能分清楚。

即使是我自己,雖然近段時間有一定的理解,卻不敢保證就是對的,只能說現階段我覺得是這樣。

我理解的認證,從字面意思說,就是身份的認證;而授權,則是資源的授權。

借用網路上別人寫的:認證解決的是你是誰,而授權解決的是可以給你什麼。

那麼從這個角度來說,乙個常規的登入獲取token,之後在其他業務中校驗token,其實只能算是認證的乙個範疇,因為這個token的作用只是校驗訪問者的身份以及是否檢驗過這個身份,只要身份驗證通過,所有資源都可以用。

假如在服務端的介面中涉及到了不同的許可權問題,然後能夠從token中獲取到這些許可權,並根據這些許可權確定是否要處理該請求的資源,那麼這裡才算是真的涉及到了授權。

需要注意的是,這裡的許可權是資源的許可權,而不是使用者的角色許可權這些,這是兩個概念。

更多認證授權的理解,也可以參考其他的部落格,例如:

和jwt一樣,oauth2也是一種規範,因為規範,就逐漸的形成了一些特定的解決方案,例如spring的oauth2。在認證和授權的業務中,oauth2解決的就是授權規範的問題。

在業務互動的過程中,oauth2授權直觀的提現,也是通過token。

標準的oauth2的token同樣是遵循jwt標準,不同的是,在普通jwt的token基礎上加入了更多的內容。

oauth2標準的token有兩個:access_token和refresh_token。

access_token用來訪問資源時授權,包含基礎授權資訊,refresh_token的作用是在access_token失效後直接續簽access_token,即上邊說的如何方便重新整理和續簽token的問題。

同時,oauth2中的授權分為客戶端模式、授權模式、簡化模式、密碼模式四種,可以根據不同的業務場景。

和上邊使用者名稱密碼登陸不同的是,oauth2中解決的更多是涉及到第三方服務的業務。

對於oauth2的詳細理解和四種授權模式,可以參考後邊鏈結中的內容,不過有些地方可能需要參考更多其他部落格,不見得都對。

大多數系統,實際上用到oauth2就已經足夠了,因為即使說服務涉及到了第三方,但是大多數時候這些第三方資源可能都是公司內,或者乙個大的團隊內。

但是隨著網際網路的發展,越來越多的系統或應用會整合外部的第三方,例如支付寶等第三方支付、例如qq等第三方登入。

因此,openid這個技術和規範就應運而生,這個技術解決的就是外部第三方互動時的乙個身份認證問題。

結合上邊所說,認證和授權分別屬於不同的範疇,解決的也都是不同的問題,因此在這種涉及到第三方,如果再涉及到資源許可權的系統中,就會引入乙個新的規範,即oidc。

oidc=(identity, authentication) + oauth2,我的理解就是openid+oauth2。

具體的用法和實現上就是,oidc在oauth2的基礎上又加了乙個token,叫做id_token。

id_token同樣的遵循jwt規範,只不過裡邊的內容是能夠體現使用者身份的資訊。

因此,oidc裡就會有三個token:access_token、refresh_token和id_token。

蘋果和蟲子2

蘋果和蟲子2 總時間限制 1000ms 記憶體限制 65536kb 描述 你買了一箱n個蘋果,很不幸的是買完時箱子裡混進了一條蟲子。蟲子每x小時能吃掉乙個蘋果,假設蟲子在吃完乙個蘋果之前不會吃另乙個,那麼經過y小時你還有多少個完整的蘋果?輸入 輸入僅一行,包括n,x和y 均為整數 輸出 輸出也僅一行...

2 類和物件

類即類別 種類,是物件導向設計最重要的概念,從一小節我們得知物件是特徵與技能的結合體,而類則是一系列物件相似的特徵與技能的結合體。那麼問題來了,先有的乙個個具體存在的物件 比如乙個具體存在的人 還是先有的人類這個概念,這個問題需要分兩種情況去看 世界上肯定是先出現各種各樣的實際存在的物體,然後隨著人...

串列埠和通訊2

繼續說iic 1 起始訊號 void iic start void sda設定為輸出,然後拉高,時鐘線拉高,等待四微秒,然後再時鐘線高的情況下拉低sda,形成下降沿,再等待4微秒,時鐘線才可以拉低。也就是說要在時鐘線高的情況下使sda形成下降沿,同時還要注意邊沿前後必須要有4微秒的等待時間。2 結束...