阿里終面:說說OAuth2.0 與 單點登錄的區(qū)別?
SSO是Single Sign On的縮寫,OAuth是Open Authority的縮寫,這兩者都是使用令牌的方式來代替用戶密碼訪問應(yīng)用。流程上來說他們非常相似,但概念上又十分不同。很多人會將其混為一談,其實這兩個還是有些區(qū)別的。
對于OAuth2.0相關(guān)內(nèi)容在Spring Cloud Alibaba 實戰(zhàn)中結(jié)合實戰(zhàn)項目源碼從零搭建有著詳細(xì)的介紹,如下圖:
?什么是單點登錄
簡單的說就是在多個應(yīng)用的系統(tǒng)中,用戶只需要登錄一次就可以訪問權(quán)限范圍內(nèi)的所有應(yīng)用子系統(tǒng),同樣的注銷也只需要注銷一次。
比如百度這個網(wǎng)站,用戶只要登錄了百度的官網(wǎng),那么對于百度百科、百度知道、百度貼吧等網(wǎng)站都是處于登錄狀態(tài),這就是一個典型的單點登錄的例子。
單點登錄和Oauth2.0的區(qū)別
雖然Oauth2.0能夠?qū)崿F(xiàn)單點登錄,但是在一些方面還是有些區(qū)別的,如下:
- 信任角度:Oauth2.0授權(quán)服務(wù)端和第三方客戶端不屬于一個互相信任的應(yīng)用群,比如微信和第三方,這就不是一個公司的產(chǎn)品;然而單點登錄的服務(wù)端和接入的客戶端都在同一個相互信任的應(yīng)用系統(tǒng)中,比如百度官網(wǎng)、百度百科,這都是一個公司的產(chǎn)品
- 資源角度:OAuth2.0授權(quán)主要是讓用戶自行決定——“我”在OAuth2.0服務(wù)提供方的個人資源是否允許第三方應(yīng)用訪問;而單點登錄的資源都在客戶端這邊,單點登錄的服務(wù)端主要用于登錄,以及管理用戶在各個子系統(tǒng)的權(quán)限信息。
- 流程角度:OAuth2.0授權(quán)的時候,第三方客戶端需要拿預(yù)先“商量”好的密碼去獲取Access Token;而單點登錄則不需要。
Oauth2.0完全可以實現(xiàn)單點登錄,但是更加側(cè)重于對于己方資源的保護(hù),了解了這兩種的區(qū)別才能正確的選擇
單點登錄的實現(xiàn)
Oauth2.0實現(xiàn)單點登錄非常簡單,比如微服務(wù)下的各個子系統(tǒng)接入Oauth2.0的認(rèn)證服務(wù),用戶從認(rèn)證服務(wù)獲取token后,直接通過網(wǎng)關(guān)轉(zhuǎn)發(fā)給下游子系統(tǒng)則可以實現(xiàn)只需要一次登錄
其實除了Oauth2.0以外,還有很多框架能夠?qū)崿F(xiàn)單點登錄,比較經(jīng)典則是CAS框架
以下是CAS框架的官方流程圖。特別注意:SSO是一種思想,而CAS只是實現(xiàn)這種思想的一種框架而已
上面的流程大概為:
- 用戶輸入網(wǎng)址進(jìn)入業(yè)務(wù)系統(tǒng)Protected App,系統(tǒng)發(fā)現(xiàn)用戶未登錄,將用戶重定向到單點登錄系統(tǒng)CAS Server,并帶上自身地址service參數(shù)。
- 用戶瀏覽器重定向到單點登錄系統(tǒng),系統(tǒng)檢查該用戶是否登錄,這是SSO(這里是CAS)系統(tǒng)的第一個接口,該接口如果用戶未登錄,則將用戶重定向到登錄界面,如果已登錄,則設(shè)置全局session,并重定向到業(yè)務(wù)系統(tǒng)。
- 用戶填寫密碼后提交登錄,注意此時的登錄界面是SSO系統(tǒng)提供的,只有SSO系統(tǒng)保存了用戶的密碼
- SSO系統(tǒng)驗證密碼是否正確,若正確則重定向到業(yè)務(wù)系統(tǒng),并帶上SSO系統(tǒng)的簽發(fā)的ticket。
- 瀏覽器重定向到業(yè)務(wù)系統(tǒng)的登錄接口,這個登錄接口是不需要密碼的,而是帶上SSO的ticket,業(yè)務(wù)系統(tǒng)拿著ticket請求SSO系統(tǒng),獲取用戶信息。并設(shè)置局部session,表示登錄成功返回給瀏覽器sessionId(tomcat中叫JSESSIONID)。
- 之后所有的交互用sessionId與業(yè)務(wù)系統(tǒng)交互即可。
整個流程還是相對比較復(fù)雜的,當(dāng)然CAS這個框架的配置也是相對比較復(fù)雜,了解過的人都想放棄,關(guān)于CAS如何去搭建,在后面會單獨介紹。
最常見的例子是,我們打開淘寶APP,首頁就會有天貓、聚劃算等服務(wù)的鏈接,當(dāng)你點擊以后就直接跳過去了,并沒有讓你再登錄一次。
總結(jié)
Oauth2.0和單點登錄的區(qū)別需要理解清楚,相對來說Oauth2.0實現(xiàn)單點登錄更加簡單,CAS雖然能夠?qū)崿F(xiàn)單點登錄,但是服務(wù)部署和配置更加復(fù)雜,不易于上手,當(dāng)然目前也有很多的系統(tǒng)在使用CAS,在選擇的時候開發(fā)者根據(jù)這些區(qū)別和復(fù)雜程度去決策。