1. 程式人生 > >身份認證系統(二)多WEB應用的單點登錄

身份認證系統(二)多WEB應用的單點登錄

會有 求和 頂級域名 等等 票據 什麽 多個 另一個 如何解決

隨著互聯網的發展,web應用的復雜度也一直在提升,慢慢的單一的web應用已經不能滿足復雜的業務需求。例如百度的搜索、新聞、百科、貼吧,其實本質上都是不同的網站。當用戶使用這些平臺的時候,我們當然不希望用戶在每一個平臺都有一個單獨的賬號,不然的話用戶和開發者可能都會有想哭的沖動。所以我們就需要一種用戶登錄一次就可以訪問所有相互信任的應用的系統,這種系統我們就管它叫單點登錄(sso,Single Sign On)系統。

簡單實現

在本系列的上一章的最後一節中我們介紹了基於cookie的認證模式,基於這種模式我們其實很容易實現一個單點登錄系統。一般我們同一個系統的多個站點會在同一個頂級域名下(如,.baidu.com.cn),這樣我們就可以讓這些站點共享同一個頂級域名的cookie。這樣只要一個站點登錄了,所有的站點就都可以拿到登錄認證信息。但是這種做法有兩個缺點:

1、我們不一定能夠保障我們所有的子系統都在同一個頂級域名下。

2、各個站點要分別實現一套登錄認證功能。

鑒權與授權

在討論如何解決僅僅基於cookie實現的單點登錄系統的缺點之前,我們要先討論另一個話題,就是鑒權與授權的分離。

我們一般說的登錄系統指的是:識別用戶身份,然後允許用戶訪問符合其身份權限的資源。這裏邊其實有兩件事,識別用戶身份這一步我們稱之為鑒權,允許用戶訪問符合其身份權限的資源這一步我們稱之為授權。在傳統的單站點應用中,我們很少會將鑒權與授權分開來討論,因為當時的登錄功能簡單。可是當代web站點的鑒權與授權都趨於多樣化。比如在鑒權的時候我們可以使用賬號密碼、手機短信驗證碼、OAuth、人臉識別等等;同樣不同站點對於授權的需求和權限的體系都是各不相同的。由於兩者的多樣化與不同,為了降低耦合,提高內聚,我們就有必要將鑒權與授權過程分開看待。

實現單點登錄系統

當我們理解了鑒權與授權的概念之後,我們就很自然的會發現,一般來講當各站點需要同一套認證體系的時候,其實他們的鑒權體系是統一的,而授權過程則可能各不相同。

我們來思考一下現實生活中我們是如何解決類似的問題的:當我們認定一個人是我們公司的員工的時候,我們就會有一個統一的部門制作和發放給我們員工一張工作證;然後員工更具這張工作證上的信息不同,決定了他在公司各個部門中能幹什麽不能幹什麽。

同樣的我們可以制作一個統一認證站點來負責鑒權這步。當用戶訪問我們的一個站點的受保護資源的時候,我們先將用戶重定向到統一認證站點;如果用戶未登錄,則跳到統一認證站點的登錄界面進行登錄,登錄成功之後生成一個用戶的身份票據(就像工作證一樣),然後將票據信息返回給用戶訪問的站點;如果用戶已登錄,則跳過登錄步驟,直接將用戶的身份票據返回給用戶訪問的站點;然後不同的站點再根據自己的授權體系,決定用戶是否能夠訪問響應的資源。

這樣我們既解決了域名可能不統一的問題,又只需要實現統一分登錄認證功能。

身份認證系統(二)多WEB應用的單點登錄