背景介紹
隨著業務與技術的發展,現今比以往任何時候都更需要單點登入 SSO 身份驗證。
現在幾乎每個網站都需要某種形式的身份驗證才能訪問其功能和內容。
隨著網站和服務數量的增加,集中登入系統已成為一種必要。
在本文中,我們將研究 SSO 身份驗證的方案演進。
問題描述
開發團隊遲早會面臨一個問題,已經開發了網站 A,新開發的網站 B 希望使用網站 A 的登入資訊,而不是使用一套新的登入資訊,如下圖所示:
事實上,你可能還希望已經在網站 A 登入的使用者自動完成網站 B 的登入。
問題的解決方案顯然是實現跨不同域之間共享會話資訊。但是,由於安全原因,瀏覽器會強制執行同源策略 - Same Origin Policy。
該策略規定,Cookies 只能由其建立者訪問。換句話說,如果網站 A 和 網站 B 不是同域,網站 B 無法訪問網站 A 的 Cookies,反之亦然,如下圖所示:
SSO 其實就是要以某種方式解決不同域之間共享會話資訊。
解決方案
一、同源解決方案
要解決不同域之間共享會話資訊,一個最簡單粗暴的辦法就是讓網站同域,如下圖所示:
1. 使用者瀏覽網站 A
2. 網站 A 發現無 *.domain.com 的 Cookies,重定向到認證中心
3. 認證中心要求使用者使用賬號密碼登入
4. 認證中心儲存 Cookies 到 *.domain.com
5. 重定向返回網站 A
6. 網站 A 讀取 *.domain.com 下的 Cookies 完成校驗,展示網站內容
7. 使用者瀏覽網站 B
8. 網站 B 讀取 *.domain.com 下的 Cookies 完成校驗,展示網站內容
二、非同源解決方案
同源的解決方案可以滿足大部分場景,但是針對一些多產品的場景,比如,阿里巴巴有天貓和淘寶兩個產品,同源解決方案顯然不能滿足需求。
不同的 SSO 協議以不同的方式共享會話資訊,但基本概念是相同的:有一個認證中心,執行身份驗證,然後以某種方式與其他域共享會話資訊。
其中一種方式是使用 JWT - JSON Web Token,認證中心使用 JWE - JSON Web Encryption 對使用者資訊進行加密,生成 JWT。
然後通過重定向的方式,把 Token 傳回原始站點,Token 包含需要驗證使用者所需的所有資訊。
由於 Token 是使用 JWT 加密的,除了認證中心外無法以任何方式修改它,具體流程如下:
1. 使用者瀏覽網站 A
2. 網站 A 發現無 domain1.com 的 Cookies,重定向到認證中心
3. 認證中心要求使用者使用賬號密碼登入
4. 認證中心儲存 Cookies 到 auth.com
5. 重定向返回網站 A 並在 URL 攜帶驗證使用者資訊的 Token
6. 網站 A 校驗 Token 完成驗證
7. 網站 A 儲存 Cookies 到 domain1.com,供後續驗證使用,並顯示網站內容
8. 使用者瀏覽網站 B
9. 網站 B 發現無 domain2.com 的 Cookies,重定向到認證中心
10. 認證中心發現有 auth.com 的 Cookies,對 Cookies 進行校驗
11. 重定向返回網站 B 並在 URL 攜帶驗證使用者資訊的 Token
12. 網站 B 校驗 Token 完成驗證
13. 網站 B 儲存 Cookies 到 domain2.com,供後續驗證使用,並顯示網站內容
總結歸納
以上就是本文需要介紹的 SSO 相關內容,大家有問題的話歡迎在文章或者在公眾號 - 跬步之巔留言交流。