IM開發基礎知識補課:正確理解前置HTTPSSO單點登陸介面的原理
1、前言
一個安全的資訊系統,合法身份檢查是必須環節。尤其IM這種以“人”為中心的社交體系,身份認證更是必不可少。
一些PC時代小型IM系統中,身份認證可能直接做到長連線中(也就是整個IM系統都是以長連線為中心:身份鑑權、資料收發、檔案傳送等等)。但當前主流的IM(尤其新一代的移動端IM)中,都是“長”(指TCP或UDP長連線)、“短”(是指Http短連線)相結合的方式。
一個現代的移動端IM“長”、“短”連線配合內容大致如下:
1)短連線用途1:前置HTTP的SSO單點介面來實現身份認證;
2)短連線用途2:叢集式的IM中可能還會有獨立(或整合於SSO單獨登陸介面中)的SLB介面(即基於HTTP短連線拉取IM伺服器叢集IP列表);
3)短連線用途3:各種小檔案的上傳、下載介面實現(頭像、圖片、語音、檔案等)都會是基於Http實現;
4)長連線用途1:使用者的實時上、下線狀態通知;
5)長連線用途2:實時的加友、加群等指令收發;
6)長連線用途3:服務端發起的其它實時指令推送等。
總之:當今主流的移動IM系統中,“長”、“短”連線分工明確,各自將自身的優勢發揮到最大化,優點是:系統分工明確、分層清晰、業務劃分合理、負載方案成本低、符合行動網路的特性等。
針對上述主流移動IM系統中“長”、“短”連線的分工方式,其中最為重要也是使用者最先接觸到的——就是基於Http的SSO單點登陸介面(有的系統裡可能並不叫SSO介面,本文討論的是其廣義:即實現身份認證功能的http介面),那麼這個SSO介面工作原理是什麼?可以怎麼來實現?有無最佳實踐建議?
OK,帶著上述的這幾個疑問,讓我們開啟本文的正文部分。
正文內容說明:正文部分介紹SSO單點登陸介面時,是以通用資訊系統的角度來闡述原理、邏輯、最佳實踐,而非專門針對IM系統,但道理是一模一樣的,理解原理後完全可以設計出適合您IM系統的SSO介面。(話外音:其實是懶的重新打字和畫圖 ^_^)。
學習交流:
– 即時通訊開發交流群:320837163 [推薦]
– 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》
(本文同步釋出於:http://www.52im.net/thread-1351-1-1.html)
2、相關文章
▼ 帶著本文對SSO單點登陸(或者說身份認證)介面的知識,您將能更好的讀懂下述技術文章:
總之,以上幾篇精選的文章可以跟本文的知識相輔相成,共同完善您的IM技術開發知識體系,希望對你有用。
▼ IM開發乾貨系列文章也適合作為IM開發的系統性入門資料(本文是其第10篇):
《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》
如果您正在查閱更多移動端IM開發資料,強烈推薦閱讀《新手入門一篇就夠:從零開發移動端IM》。
3、原作者
楊麗:擁有多年網際網路應用系統研發經驗,曾就職於古大集團,現任職中青易遊的系統架構師,主要負責公司研發中心業務系統的架構設計以及新技術積累和培訓。現階段主要關注開源軟體、軟體架構、微服務以及大資料。
張輝清:10 多年的 IT 老兵,先後擔任攜程架構師、古大集團首席架構、中青易遊 CTO 等職務,主導過兩家公司的技術架構升級改造工作。現關注架構與工程效率,技術與業務的匹配與融合,技術價值與創新。
4、單點登入原理簡介
假設一個場景:公司內部有財務、OA、訂單服務等各類相互獨立的應用系統,員工張三對這些系統有操作許可權,如果張三想要登入某個系統進行業務操作,那麼他需要輸入相應的賬號與密碼。
想象一下:當公司內部有 100 個應用系統,張三是不是要輸入 100 次使用者名稱和密碼進行登入,然後分別才能進行業務操作呢?顯然這是很不好的體驗。
因此我們需要引入一個這樣的機制:張三隻要輸入一次使用者名稱和密碼登入,成功登入後,他就可以訪問財務系統、OA 系統、訂單服務等系統——這就是單點登入。
單點登入的英文全稱是 Single Sign On,簡稱是 SSO:
它的意思是說使用者只需要登入一次,就可以在個人許可權範圍內,訪問所有相互信任應用的功能模組,不管整個應用群的內部有多麼複雜,對使用者而言,都是一個統一的整體。使用者訪問 Web 系統的整個應用群與訪問單個系統一樣,登入和登出分別只要一次就夠了。
舉個簡單的例子,你登入了百度網頁之後,點選跳轉到百度貼吧,這時可以發現你已經自動登入了百度貼吧——這就是單獨登陸的原理。
5、理論聯絡實際來講解SSO單點登陸技術實現
5.1 基本介紹
針對本文上半部分的原理介紹,我們以一個真實的資訊系統為例,理論聯絡實際來講解具體的SSO單點登陸技術實現(實際上,用IM系統的設計思路來看這個例子,可能有點複雜,但知識是相通的,它更有助於對SSO完整知識體系的理解。)
SSO 的技術實現要想做好並不容易,作者認為需求優先順序應該先是單點登入和單點登出功能,然後是應用接入的門檻,最後是資料安全性,安全性對於 SSO 也非常重要。SSO 的核心是認證中心,但要實現使用者一次登入,到處訪問的效果,技術實現需要建立在使用者系統、認證中心、許可權系統、企業門戶的基礎上。
各職責如下:
使用者系統:負責使用者名稱、密碼等帳戶資訊管理,包括增加、修改、啟用、停用使用者帳號,同時為認證中心提供對使用者名稱和密碼的校驗;
認證中心:負責憑證 token 的生成、加密、頒發、驗證、銷燬、登入 Login、登出 Logout。使用者只有擁有憑證並驗證通過才能訪問企業門戶;
許可權系統:負責角色管理、資源設定、授權設定、鑑定許可權,具體實現可參考 RBAC。許可權系統可為企業門戶提供使用者許可權範圍內的導航;
企業門戶:作為應用系統的整合門戶 (Portal),整合了多個應用系統的功能,為使用者提供連結導航、使用者資訊和登出功能等。
5.2 服務端功能實現
主要包含以下內容:
登入認證:接收登入帳號資訊,讓使用者系統驗證使用者的登入資訊;
憑證生成:建立授權憑證 token,生成的憑證一般包含使用者帳號資訊、過期時間等資訊,它是一串加密的字串,加密演算法如 AES{憑證明文 +MD5 加資訊},可採用 JWT 標準;
憑證頒發:與 SSO 客戶端通訊,傳送憑證給 SSO 客戶端;
憑證驗證:接收並校驗來自 SSO 客戶端的憑證有效性,憑證驗證包括演算法驗證和資料驗證;
憑證銷燬與登出:接收來自 SSO 客戶端的登出請求,記錄並銷燬憑證,跳轉至登入頁面。
5.3 客戶端功能實現
客戶端的實現邏輯大致如下:
1)請求攔截:攔截應用未登入請求,跳轉至登入頁面;
2)獲取憑證:接收並儲存由 SSO 服務端發來的憑證,憑證儲存的方式有 Cookie、Session、網址傳參、Header 等;
3)提交憑證驗證:與 SSO 服務端通訊,發出校驗憑證有效性的請求;
4)獲取使用者許可權:獲取該憑證的使用者許可權,並返回受保護資源給使用者;
5)憑證銷燬與登出:銷燬本地會話,然後跳轉至登出頁面。
5.4 使用者單點登入流程
使用者的單點登入流程如下:
1)登入:將使用者輸入的使用者名稱和密碼傳送至認證中心,然後認證中心呼叫使用者系統來驗證登入資訊;
2)生成並頒發憑證:通過登入資訊的驗證後,認證中心建立授權憑證 token,然後把這個授權憑證 token 返回給 SSO 客戶端。SSO 客戶端拿到這個 token,進行儲存。在後續請求中,在 HTTP 請求資料中都得加上這個 token;
3)憑證驗證:SSO 客戶端傳送憑證 token 給認證中心,認證中心校驗這個 token 的有效性。憑證驗證有演算法驗證和資料驗證,演算法驗證可在 SSO 客戶端完成。
5.5 使用者訪問流程和單點登出
以上是使用者的訪問流程,如果使用者沒有有效的憑證,認證中心將強制使用者進入登入流程。對於單點登出,使用者如果登出了應用群內的其中一個應用,那麼全域性 token 也會被銷燬,應用群內的所有應用將不能再被訪問。
5.6 具體接入與整合
例子中的應用接入與整合具體如下:
1)使用者系統:接入國內機票平臺的使用者系統,負責登入認證;
2)許可權系統:接入國內機票平臺的許可權系統;
3)認證中心:負責生成並頒發憑證、銷燬憑證,改造國內機票平臺的登入、登出;
4)憑證驗證:在國內機票、國際機票應用系統中呼叫 SSO 客戶端元件實現憑證的驗證;
5)企業門戶:由國內機票平臺、國際機票平臺承擔。
6、附加知識:一項被稱為JWT的技術
JSON Web Token (JWT) 是目前應用最為廣泛的 token 格式,是為了在網路應用環境間傳遞宣告而執行的一種基於 JSON 的開放標準(RFC 7519)。該 token 設計緊湊且安全,特別適用於分散式站點的單點登入、API 閘道器等場景。
JWT 的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的宣告資訊。該 token 也可直接被用於認證,也可被加密。JWT 資訊體由 3 部分構成:頭 Header+ 載荷 Payload+ 簽名 Signature。
JWT具體優點如下:
JWT 支援多種語言,C#、Java、JavaScript、Node.js、PHP 等很多語言都可以使用;
JWT 可以自身儲存一些和業務邏輯有關的所必要的非敏感資訊,因為有了 Payload 部分;
利於傳輸,因為 JWT 的構成非常簡單,位元組佔用很小;
不需要在服務端儲存會話資訊,不僅省去服務端資源開銷,而且使得應用易於擴充套件。
(本文同步釋出於:http://www.52im.net/thread-1351-1-1.html)
附錄:更多IM開發技術文章
[1] 有關IM架構設計:
《一套海量線上使用者的移動端IM架構設計實踐分享(含詳細圖文)》
《騰訊QQ1.4億線上使用者的技術挑戰和架構演進之路PPT》
>> 更多同類文章 ……
[2] 有關IM安全的文章:
《即時通訊安全篇(一):正確地理解和使用Android端加密演算法》
《即時通訊安全篇(四):例項分析Android中金鑰硬編碼的風險》
《即時通訊安全篇(五):對稱加密技術在Android平臺上的應用實踐》
《傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示》
《理論聯絡實際:一套典型的IM通訊協議設計詳解(含安全層設計)》
《微信新一代通訊安全解決方案:基於TLS1.3的MMTLS詳解》
《來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享》
《Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例程式碼)》
>> 更多同類文章 ……
[3] IM開發綜合文章:
《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》
《開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)》
《騰訊原創分享(一):如何大幅提升行動網路下手機QQ的圖片傳輸速度和成功率》
《騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(上篇)》
《騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(下篇)》
《如約而至:微信自用的移動端IM網路層跨平臺元件庫Mars已正式開源》
《基於社交網路的Yelp是如何實現海量使用者圖片的無失真壓縮的?》
>> 更多同類文章 ……
(本文同步釋出於:http://www.52im.net/thread-1351-1-1.html)
相關文章
- IM開發基礎知識補課(四):正確理解HTTP短連線中的Cookie、Session和TokenHTTPCookieSession
- IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議服務端資料庫
- IM開發基礎知識補課(十):大型IM系統有多難?萬字長文,搞懂異地多活!
- IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?服務端架構
- Docker--基礎知識點--19--映象原理之分層理解Docker
- 全面的MySQL基礎運維知識點(一)MySql運維
- 全面的MySQL基礎運維知識點(三)MySql運維
- 全面的MySQL基礎運維知識點(二)MySql運維
- 開發基礎知識
- 課時7.其它知識補充(理解)
- rman基礎知識補充
- JAVA基礎知識補漏Java
- Java 反射【前置知識點】Java反射
- 單點登陸原理及程式碼(CAS)
- 蘋果開發基礎知識蘋果
- Web前端開發精品課HTML CSS JavaScript基礎教程JavaScript部分知識點總結Web前端HTMLCSSJavaScript
- 純基於PHP的單點登陸PHP
- java基礎知識點Java
- JavaWeb基礎知識點JavaWeb
- JavaScript基礎知識點JavaScript
- 正規表示式基礎知識
- shell基礎知識查缺補漏
- CSS基礎知識簡介CSS
- Epub基礎知識介紹
- 分散式系統知識分享:正確理解CAP定理分散式
- 安卓(Android)開發基礎知識安卓Android
- app,小程式開發基礎知識APP
- 正規表示式(一) 基礎知識
- Java基礎知識點梳理Java
- Servlet基礎知識點整理Servlet
- JavaScript部分基礎知識點JavaScript
- Java 基礎面試知識點Java面試
- Python基礎入門知識點——if 語句簡介Python
- Web開發初探(系統理解Web知識點)Web
- pwn前置知識
- JUC前置知識
- 小程式開發之基礎知識(0)
- 前端開發基礎知識整理–css篇前端CSS