阿里終面:說說OAuth2.0 與 單點登錄的區別?
SSO是Single Sign On的縮寫,OAuth是Open Authority的縮寫,這兩者都是使用令牌的方式來代替用戶密碼訪問應用。流程上來說他們非常相似,但概念上又十分不同。很多人會將其混為一談,其實這兩個還是有些區別的。
對于OAuth2.0相關內容在Spring Cloud Alibaba 實戰中結合實戰項目源碼從零搭建有著詳細的介紹,如下圖:
?什么是單點登錄
簡單的說就是在多個應用的系統中,用戶只需要登錄一次就可以訪問權限范圍內的所有應用子系統,同樣的注銷也只需要注銷一次。
比如百度這個網站,用戶只要登錄了百度的官網,那么對于百度百科、百度知道、百度貼吧等網站都是處于登錄狀態,這就是一個典型的單點登錄的例子。
單點登錄和Oauth2.0的區別
雖然Oauth2.0能夠實現單點登錄,但是在一些方面還是有些區別的,如下:
- 信任角度:Oauth2.0授權服務端和第三方客戶端不屬于一個互相信任的應用群,比如微信和第三方,這就不是一個公司的產品;然而單點登錄的服務端和接入的客戶端都在同一個相互信任的應用系統中,比如百度官網、百度百科,這都是一個公司的產品
- 資源角度:OAuth2.0授權主要是讓用戶自行決定——“我”在OAuth2.0服務提供方的個人資源是否允許第三方應用訪問;而單點登錄的資源都在客戶端這邊,單點登錄的服務端主要用于登錄,以及管理用戶在各個子系統的權限信息。
- 流程角度:OAuth2.0授權的時候,第三方客戶端需要拿預先“商量”好的密碼去獲取Access Token;而單點登錄則不需要。
Oauth2.0完全可以實現單點登錄,但是更加側重于對于己方資源的保護,了解了這兩種的區別才能正確的選擇
單點登錄的實現
Oauth2.0實現單點登錄非常簡單,比如微服務下的各個子系統接入Oauth2.0的認證服務,用戶從認證服務獲取token后,直接通過網關轉發給下游子系統則可以實現只需要一次登錄
其實除了Oauth2.0以外,還有很多框架能夠實現單點登錄,比較經典則是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與業務系統交互即可。
整個流程還是相對比較復雜的,當然CAS這個框架的配置也是相對比較復雜,了解過的人都想放棄,關于CAS如何去搭建,在后面會單獨介紹。
最常見的例子是,我們打開淘寶APP,首頁就會有天貓、聚劃算等服務的鏈接,當你點擊以后就直接跳過去了,并沒有讓你再登錄一次。
總結
Oauth2.0和單點登錄的區別需要理解清楚,相對來說Oauth2.0實現單點登錄更加簡單,CAS雖然能夠實現單點登錄,但是服務部署和配置更加復雜,不易于上手,當然目前也有很多的系統在使用CAS,在選擇的時候開發者根據這些區別和復雜程度去決策。