SSO 單點登錄和 OAuth2-0 的區別和理解
一、概述
SSO 是 Single Sign On 的縮寫,OAuth 是 Open Authority 的縮寫,這兩者都是使用令牌的方式來代替用戶密碼訪問應用。流程上來說他們非常相似,但概念上又十分不同。SSO 大家應該比較熟悉,它將登錄認證和業務系統分離,使用獨立的登錄中心,實現了在登錄中心登錄後,所有相關的業務系統都能免登錄訪問資源。
OAuth2.0 原理可能比較陌生,但平時用的卻很多,比如訪問某網站想留言又不想註冊時使用了微信授權。以上兩者,你在業務系統中都沒有賬號和密碼,賬號密碼是存放在登錄中心或微信服務器中的,這就是所謂的使用令牌代替賬號密碼訪問應用。
二、SSO
兩者有很多相似之處,下面我們來解釋一下這個過程。先來講解 SSO,通過 SSO 對比 OAuth2.0,才比較好理解 OAuth2.0 的原理。SSO 的實現有很多框架,比如 CAS 框架,以下是 CAS 框架的官方流程圖。特別注意:SSO 是一種思想,而 CAS 只是實現這種思想的一種框架而已
上面的流程大概爲:
-
用戶輸入網址進入業務系統
Protected App
,系統發現用戶未登錄,將用戶重定向到單點登錄系統CAS Server
,並帶上自身地址 service 參數 -
用戶瀏覽器重定向到單點登錄系統,系統檢查該用戶是否登錄,這是 SSO(這裏是 CAS) 系統的第一個接口,該接口如果用戶未登錄,則將用戶重定向到登錄界面,如果已登錄,則設置全局 session,並重定向到業務系統
-
用戶填寫密碼後提交登錄,注意此時的登錄界面是 SSO 系統提供的,只有 SSO 系統保存了用戶的密碼,
-
SSO 系統驗證密碼是否正確,若正確則重定向到業務系統,並帶上 SSO 系統的簽發的 ticket
-
瀏覽器重定向到業務系統的登錄接口,這個登錄接口是不需要密碼的,而是帶上 SSO 的 ticket,業務系統拿着 ticket 請求 SSO 系統,獲取用戶信息。並設置局部 session,表示登錄成功返回給瀏覽器
sessionId
(tomcat 中叫JSESSIONID
) -
之後所有的交互用
sessionId
與業務系統交互即可
最常見的例子是,我們打開淘寶 APP,首頁就會有天貓、聚划算等服務的鏈接,當你點擊以後就直接跳過去了,並沒有讓你再登錄一次
三、OAuth2.0
OAuth2.0 有多種模式,這裏講的是 OAuth2.0 授權碼模式,OAuth2.0 的流程跟 SSO 差不多,在 OAuth2 中,有授權服務器、資源服務器、客戶端這樣幾個角色,當我們用它來實現 SSO 的時候是不需要資源服務器這個角色的,有授權服務器和客戶端就夠了。
授權服務器當然是用來做認證的,客戶端就是各個應用系統,我們只需要登錄成功後拿到用戶信息以及用戶所擁有的權限即可
-
用戶在某網站上點擊使用微信授權,這裏的某網站就類似業務系統,微信授權服務器就類似單點登錄系統
-
之後微信授權服務器返回一個確認授權頁面,類似登錄界面,這個頁面當然是微信的而不是業務系統的
-
用戶確認授權,類似填寫了賬號和密碼,提交後微信鑑權並返回一個 ticket,並重定向業務系統。
-
業務系統帶上 ticket 訪問微信服務器,微信服務器返回正式的 token,業務系統就可以使用 token 獲取用戶信息了
簡介一下 OAuth2.0 的四種模式:
授權碼(authorization-code)
授權碼(authorization code)方式,指的是第三方應用先申請一個授權碼,然後再用該碼獲取令牌。這種方式是最常用的流程,安全性也最高,它適用於那些有後端的 Web 應用。授權碼通過前端傳送,令牌則是儲存在後端,而且所有與資源服務器的通信都在後端完成。這樣的前後端分離,可以避免令牌泄漏。
隱藏式(implicit)
有些 Web 應用是純前端應用,沒有後端。這時就不能用上面的方式了,必須將令牌儲存在前端。RFC 6749 就規定了第二種方式,允許直接向前端頒發令牌。這種方式沒有授權碼這個中間步驟,所以稱爲(授權碼)“隱藏式”(implicit)
密碼式(password)
如果你高度信任某個應用,RFC 6749 也允許用戶把用戶名和密碼,直接告訴該應用。該應用就使用你的密碼,申請令牌,這種方式稱爲 "密碼式"(password)。
客戶端憑證(client credentials)
最後一種方式是憑證式(client credentials),適用於沒有前端的命令行應用,即在命令行下請求令牌。
簡單流程
四、說一下幾個名詞的區別
首先,SSO 是一種思想,或者說是一種解決方案,是抽象的,我們要做的就是按照它的這種思想去實現它
其次,OAuth2 是用來允許用戶授權第三方應用訪問他在另一個服務器上的資源的一種協議,它不是用來做單點登錄的,但我們可以利用它來實現單點登錄。在本例實現 SSO 的過程中,受保護的資源就是用戶的信息(包括,用戶的基本信息,以及用戶所具有的權限),而我們想要訪問這這一資源就需要用戶登錄並授權,OAuth2 服務端負責令牌的發放等操作,這令牌的生成我們採用 JWT,也就是說 JWT 是用來承載用戶的 Access_Token 的
最後,Spring Security、Shiro 是用於安全訪問的,用來做訪問權限控制,都是一個用 Java 寫的框架.
作者:ximeneschen
來源:ximeneschen.blog.csdn.net/article/details/115182080
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/OVBqEtJDPjAQV_mFbDM9fA