首頁  >  文章  >  後端開發  >  PHP單點登入的問題

PHP單點登入的問題

WBOY
WBOY原創
2016-08-18 09:15:32890瀏覽

我做了一個單一登入遇到一個問題是:例如有A、B、C三系統,當沒有登錄的時候會跳到S系統進行登入,登錄成功會產生一個token,並把token傳回來,同時會把token存到redis裡面。但是B、C系統如何去取得那個token?

回覆內容:

我做了一個單一登入遇到一個問題是:例如有A、B、C三系統,當沒有登錄的時候會跳到S系統進行登入,登錄成功會產生一個token,並把token傳回來,同時會把token存到redis裡面。但是B、C系統如何去取得那個token?

拿到這個token之後,用curlheader的方式把值分別發送到另外兩個B、C系統的介面中,介面中GET或則POST接收過來的接收過來的 token

參數,然後處理這個token值。例如把token值存入redis、session等

親,你現在都存入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

。這時候A系統拿到了ticket,在內部去請求S系統的校驗接口,S系統拿這個ticket和資料庫裡的比對,找出對應用戶的資訊回傳給A系統,A系統就知道要登入的用戶是誰了。

建議題主去看一下CAS協定 https://apereo.github.io/cas/...


有N多理由反對採納的答案。
首先發放票據和驗證票據的過程不對(這個系統通常還要做雙機熱備等防單點失效,或者分佈式之類的)
如其他人所說,100個系統難道說推送100個?超時什麼的怎麼搞?
如果有一個系統登出了,其他系統應該也要登出?

如果被修改了權限,只允許登入A,不允許登入B,怎麼搞?

不存在跨域問題的。
  1. 進入a系統的時候,跳到去s系統。
  2. s系統驗證帳號後,讓瀏覽器帶著票據(在url參數裡)跳回a系統。
  3. 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系統的專門介面。

,,,,,,,,,,

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn