對於剛開始接觸身份認證的朋友對於單點登錄,OAuth2.0,JWT 等等會有諸多疑惑,甚至還會問既然有了 JWT 還拿 單點登錄做什麼?還拿 OAuth2.0 做什麼?
不知做過身份認證的 xdm 看到這裏是不是感覺這句話有點迷??👀👀 他們有啥必然的關係嗎,並沒有
這篇文章旨在闡述 單點登錄 ,OAuth2.0 以及 JWT 具體是個啥,其他的關聯內容會簡單提及,希望能夠對你有幫助
✔單點登錄是什麼?
單點登錄 英文翻譯為 Single Sign On,簡稱就是SSO
他是一種思想,期望的是在多系統的應用中,只要在其中一個系統上進行登錄,那麼就可以直接訪問其他任何一個互信的系統
簡單來説就是,一次登錄,多系統多次使用😁😁
✔為什麼要使用單點登錄?
自然是為了讓用户能夠更簡單更高效更便捷的訪問多個關聯繫統
其實通過這個簡單有趣的思想,我們就可以知道,單點登錄的由來,自然還是用户的需求驅動的
過去我們的系統比較少,每個系統都會去實現和維護一個登錄認證模塊,基本上是賬號密碼登錄,手機短信驗證碼登錄等等
可發展到現在,很多業務是關聯多個子系統的,如果我們訪問每一個子系統,都要完成一次認證,(例如每個系統都要我們輸入賬號密碼) ,那麼我們可能會瘋掉,這種設計太反人類 😂😂
不過還是有一點好,就是我們可以把我們的密碼記得更加牢固
因此,如果你是用户,你也期望,只用登錄認證一次,我就可以訪問其關聯的所有系統,這樣更加人性化
✔通用的單點登錄實現方式有哪些
現在用的比較多的單點登錄實現方式有如下四種,從實現方式從簡單到複雜排序為
- JWT ( Json web token )基於 Token 的認證授權機制
<!---->
- CAS (Central Authentication Service)中心授權服務
<!---->
- OAuth2.0 (Open Authorization 2.0) 開放授權協議
<!---->
- SAML (Security Assertion Markup Language) 安全斷言標記語言
每一種協議都有自己的一個認證流程,思想都差不多,本篇文章重點聊聊 JWT 和 OAuth2.0
✔什麼叫做認證,什麼叫做授權?
首先,對於上述內容,一會兒認證,一會兒授權,到底有啥不一樣??
對於看到 Authorization 這個單詞,你認為是授權,還是認證?
看到 Authentication 這個單詞,又是如何理解的呢?
認證 Authentication ,關注的是需要你證明你是誰,是一個證明自己身份的過程
👀例如咱們去參加演唱會,你如何證明你可以進去聽?
是不是可以用你手上的票來證明你的身份,是一個給了錢買了票能聽歌的人
這個時候,你過了演唱會的大門,進入到場子內,你會發現你這樣的身份,只是被授權 Authorization 可以進入某些區域,另外的一些區域你是沒有辦法進入的
所以,我們此刻就知道了
- 認證是去證明你的身份,授權是判斷你可以訪問哪一些資源
<!---->
- 認證發生在授權之前,授權發生在認證之後
✔JWT 是什麼?
JWT , Json web token 是基於 Token 的認證授權機制
見名知意,jwt 也是一種 token ,只不過這種 token 有自己的一些約束和規定
一個 JWT 由 頭(header),載荷(payload),簽名(signature) 組成,具體細節可以查看這篇文章內容:JWT身份認證(附帶源碼講解)
此處聊一下關於使用 JWT 的方式來實現單點登錄,
簡單流程如下
對於此處,我們一般會去使用 IDaaS (作為認證中心) 來進行認證,在 IDaaS 中,是可以創建應用的,此處的應用即是我們的關聯繫統
IDaaS 認證完畢後會將用户信息,具體的簽名算法,生成一個 JWT ,給到具體的應用(關聯繫統) ,關聯繫統用秘鑰解析 JWT 並拿到具體的用户信息之後,再去完成自己平台內部的各種校驗,進而讓該用户完成認證和授權
可以查看到,更多的是需要處理 JWT 產生和解析的一個過程,約定好協議字段就可以了,這種方式最簡單
✔OAUTH2.0 是什麼?
OAuth2.0 (Open Authorization 2.0) 開放授權協議
見名知意,他是一個授權協議,而不是一個認證協議
此處的 2.0 協議是不兼容之前的 1.0 協議的,此處需要注意,具體更加細節的內容可以查閲:RFC 6749
👀先舉一個例子説明為什麼要用 OAuth
咱們登錄掘金的時候,我們不想在掘金上註冊賬號密碼,而且我們還想直接通過登錄微信,來達到登錄掘金的目的
那麼掘金就不得不和微信有交互,就需要獲取到微信的授權
用過這種方式登錄的人就知道這種場景,在掘金頁面選擇微信登錄的時候,會彈出掘金正在申請微信授權用户的暱稱和頭像,需要我們同意
我們同意之後,掘金獲取到微信授權,拿到暱稱和頭像,我們就可以順利的使用微信賬號登錄到掘金平台上了
此刻是否會有同學問,直接讓微信告訴掘金賬號密碼不就可以了嗎?這樣豈不是更方便?
方便是方便了,但是這會埋下巨大的安全問題:
- 對於各大平台來説,密碼是隱私,怎麼可以給多第三方平台呢
<!---->
- 如果微信將賬號密碼給了掘金,那麼掘金就可以隨時隨地的登錄我們用户的賬號,這是不安全的,而且也是沒有辦法設置掘金可以使用賬號密碼的方式訪問微信的資源範圍和其有效期的
<!---->
- 按照這種方式,其他平台也可以這樣來通過微信授權的方式來登錄其他第三方平台,若密碼被泄漏了,那麼用户在微信上的數據就全部泄漏了,安全問題很大喲
正是因為這樣的方式行不通,有智慧的大佬們便推出了 OAuth 授權協議😁😁
✔OAuth2.0 的基本流程
舉個例子:在掘金中使用微信認證的方式來登錄掘金,主要看大體的方向和流程
通過上述流程我們可以發現和解釋關於OAuth2.0 涉及到的名詞
其中,我們可以看到微信在整個過程中所處的角色是:
- 資源服務器
<!---->
- 授權服務器
登錄的這個微信用户,叫做:
- 資源擁有者
掘金向微信請求授權的過程中會帶上 Redirect_Uri 和 State
- Redirect_Uri 表示經過微信用户同意之後,頁面會被重定向到的地方,並且還會給這個Redirect_Uri 帶上用户的登錄憑證 code 和 State 原值(用於防篡改)
掘金獲取到授權許可之後,通過登錄憑證向微信拿到訪問令牌 Access Token,
掘金拿着 Access Token 即可訪問微信的暱稱和頭像,這個就屬於
- Scope 訪問範圍,決定掘金可以對用户可以訪問哪些資源
總結
至此,相信你應該知道什麼是單點登錄,什麼是 JWT ,什麼是 OAuth2.0 協議了吧
單點登錄是一種思想
JWT 是一種 Token 的形式
OAuth2.0 協議是一種授權協議
單點登錄 可以用OAuth2.0 協議來進行實現,實現 OAuth2.0 協議過程中,使用到的 Token 就可以使用 JWT 的方式來生成 Token
感謝閲讀,歡迎交流,點個贊,關注一波 再走吧
歡迎點贊,關注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裏
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵雲原生,歡迎點贊關注收藏,下次見~
文中提到的技術點,感興趣的可以查看這些文章:
- OAUTH之釘釘第三方授權
<!---->
- JWT身份認證(附帶源碼講解)
<!---->
- go-zero jwt 鑑權快速實戰