現在有多個 WebApp,想用最小的代價實現 SSO 單點登錄。所謂最小代價,我的理解就是對原有 WebApp 的改動最小,因此
- 在旁路增加一個 SsoWebApp 用於管理 SSO 的賬號,進行身份認證後實現跳轉原有 WebApp;
- 保留原有 WebApp 登錄方式不做修改,增加一個單獨的 sso 登錄接口實現從 Ssoweb App 跳轉登錄。
具體的登錄流程如下:
用戶首先在 SsoWebApp 中完成登錄,再通過鏈接清單,選擇要跳轉的目標 WebApp 的 sso 接口,爲方便通過超級鏈接跳轉,建議這個接口使用 GET 方式,當然要用 POST 方式也是可以的。
跳轉鏈接示例
http://WebApp1/sso?token=eyJ1aWQiOiIxMjM0NTYiLCAiZXhwaXJlIjoiMjAyMjA3MTUiLCAic2FsdCI6IjlENDdDRTI3LTU1MzEtNDRENS05QUUxLTVEMUQ3OUU2QUZFOCJ9
這裏 token 的明碼採用 json 描述
{ "uid":"123456", //用戶賬號 "expire":"20220715235900", //token 有效期 "salt":"9D47CE27-5531-44D5-9AE1-5D1D79E6AFE8" //其他數據 }
爲防止 token 被纂改,可使用 RSA 私鑰簽名後 Base64 編碼。
當 WebApp 的 sso 接口接收 token 後調用 SsoWebApp 的公鑰解密方法還原出 json 進行判斷
if (當前WebApp內存在(uid) && expire >= 當前時刻) 調用 WebApp 自己的登錄驗證方式,完成對 uid 的身份認證,進行正常的頁面跳轉 end if
要實現以上登錄流程,旁路的 SsoWebApp 需要實現
- 用戶賬戶的 CURD UI, 關鍵字段 uid, password
- 用戶賬戶下 SSO 記錄的 CURD UI,關鍵字段 uid, appName, ssoUrl
- 用戶登錄 UI 和顯示可用 SSO 站點列表 UI(跳轉鏈接)
- WebAPI 接口,提供公鑰解密方法
以上 SSO 登錄方案存在的一個不足,是用戶在 SsoWebApp 的退出操作無法聯動 WebApp 退出,反之亦然。
因爲要實現登出聯動,不可避免地需要改造 WebApp 的原有登出接口,可以實現只不過需要花費額外的代價了。