我做了一個單一登入遇到一個問題是:例如有A、B、C三系統,當沒有登錄的時候會跳到S系統進行登入,登錄成功會產生一個token,並把token傳回來,同時會把token存到redis裡面。但是B、C系統如何去取得那個token?
我做了一個單一登入遇到一個問題是:例如有A、B、C三系統,當沒有登錄的時候會跳到S系統進行登入,登錄成功會產生一個token,並把token傳回來,同時會把token存到redis裡面。但是B、C系統如何去取得那個token?
拿到這個token
之後,用curl或header的方式把值分別發送到另外兩個B、C系統的介面中,介面中GET
或則POST
接收過來的接收過來的
token
親,你現在都存入
redis了,B、C連結上
redis然後直接從
redis
反對目前的最佳答案,舉個例子,假如單點登錄要負責100個系統的登錄,每個系統有用戶登錄之後都要請求99遍嗎?那還叫什麼單一登入。
其他說直接從redis裡讀token的人,你們知道哪個用戶去讀哪個key嘛?
所謂單點登錄,並不是用戶登入了A就代表也能登入B和C,而是登入了S就可以登入A、B、C。
所以需要兩個東西:
1.S系統本身的cookie/session,只要使用者登入了S系統(不管是直接存取S還是因為要登入A而存取S),就產生該使用者在S系統下的cookie/session,不需要做任何跨域之類的處理。 2.login ticket,使用者從A系統過來,S系統判斷使用者是否登入了S系統,如果沒登入則要求登錄,登入之後或本身已經是登入狀態,則會產生一個唯一的ticket,將該使用者以及ticket存入資料庫,然後將ticket透過使用者瀏覽器回傳給A系統,及S系統讓使用者瀏覽器跳到
http://AAA.com/login/callback?ticket=xxxxx
建議題主去看一下CAS協定 https://apereo.github.io/cas/...
有N多理由反對採納的答案。
首先發放票據和驗證票據的過程不對(這個系統通常還要做雙機熱備等防單點失效,或者分佈式之類的)
如其他人所說,100個系統難道說推送100個?超時什麼的怎麼搞?
如果有一個系統登出了,其他系統應該也要登出?
不存在跨域問題的。
a系統這時候被傳入了票據,系統內部用curl之類的方法去s系統驗證票據(還要帶上自身系統的key等證明a系統的這點驗證合法性)
,如果是授權票據(即便登入了s系統,也不代表可以登入a系統,具體由s系統判斷所發放的票據登入權限),那麼就讓進入,否則就接著跳轉回s系統的登入介面。樓主可以部署一下某java版開源單一登入系統,以了解具體用法和流程。也可以搞下OAUTH2.0之類的授權系統。
b,c提供個獲取token的接口,登陸成功刷調下就行
可以考慮用cookie來儲存、傳遞🎜
主站在登陸完成後,在登入伺服器跳轉回來後的那個頁面加上跨域代碼,同時發送給從站(或者說其他站點)即可,代碼如下
<code><script src=xxxx.com?token=aaaaaa> </code>
這樣在xxxx裡面即可取得token,處理驗證即可
推薦使用UCenter或OpenCenter,都可以輕鬆實現單一登入
樓主的意思應該是:3個系統,跨域不知道怎麼保存sessionid吧。 可以考慮下 UCenter 或 PHP利用P3P實現跨域。
一般token是經過一些加密演算法+salt算出來的,B、C接收到token使用同樣的加密演算法驗證就可以了。
token不是被傳回B、C系統了嗎?可以直接連redis,規範點就將token放到參數或Header上請求S系統的專門介面。
,,,,,,,,,,