2015-11-24 17 views
5

我想了解如何在使用Json Web令牌的單點登錄體系結構中實現註銷功能。如何在基於JWT的單點登錄身份驗證體系結構中實現註銷?

比方說,我們有:

  • example1.com
  • example2.com
  • authserver.com

當用戶有對example1.com認證,他將被重定向到authserver.com這驗證用戶憑證,創建一個簽名的JWT令牌並將用戶重定向迴帶有此標記的。 example1.com將設置一個cookie(或LocalStorage密鑰),並且只要令牌未過期,用戶將在example1.com上進行身份驗證。不需要致電authserver.com來識別用戶。

然後用戶轉到參與SSO體系結構的example2.com。用戶需要在那裏進行身份驗證,因此example2.com也會將用戶重定向到authserver.com,該用戶可以識別用戶(使用它首次設置的cookie),創建新的JWT令牌並自動將用戶重定向回example2.com。然後example2.com將設置一個cookie(或一個LocalStorage密鑰),並且只要令牌未過期,用戶將在example2.com上進行認證。不需要致電authserver.com來識別用戶。

現在,如何實現「註銷」功能?

如果用戶在example1.com上註銷,example1.com上的JWT令牌將被刪除,用戶不應該在那裏進行身份驗證。但只要他試圖到達保護區,example1.com將把他重定向到authserver.com,用戶將被識別並自動再次登錄...即使他剛剛註銷!

Quetion 1)所以我想,當用戶在example1.com註銷,以authserver.com呼叫必須做刪除的cookie被authserver.com設置,使用戶不會被記錄自動了嗎?

排隊2)如果是這樣,example2.com怎麼辦?用戶是否仍然在那裏進行身份驗證?如果不是,建議的流程是什麼,所以example2.com知道它爲用戶提供的JWT令牌不再有效?

回答

2

1)https://openid.net/specs/openid-connect-session-1_0.html#RPLogout是一個規格(還有其他規格適用於不同的策略)也可以退出authserver。它定義了example1.com將重定向到的end_session_endpoint。

2)我認爲這取決於你想要它做什麼。你可能不想殺掉example2.com會話 - 在這種情況下example2.com會繼續。 example2.com的JWT仍然有效。如果你想註銷所有的客戶端,這有點複雜但可能。在我的項目中,註銷一臺客戶端和authserver是我們想要的。

+0

非常有趣,謝謝!但我不確定爲什麼用戶應該在他退出時重定向到OP ...我無法想象出現這種情況的真實情況。當我點擊「註銷」鏈接時,我希望直接註銷,而不是重定向到其他站點以確認操作!另外,即使用戶被重定向到OP並確認他想註銷,他仍然可以在另一個站點「example2.com」上進行身份驗證,例如。所以結果有點奇怪,在我看來。但是,如果有'example2.com'知道它的標記無效的方法,那麼這個流程是有意義的。 – electrotype

+0

我想知道後端服務器'example1.com'是否可能會在OP *自身*上調用'end_session_endpoint'的問題,通過傳遞JWT令牌來清除會話...因此,不需要讓用戶在那裏重新定向。我錯過重要的東西嗎? – electrotype

+2

一個OP實現IdentityServer3(https://identityserver.github.io/Documentation/docsv2/endpoints/endSession.html)將重定向僅在您提供JTW和post_logout_redirect_uri時立即將您重定向回客戶端。如果一切正常,你甚至看不到OP。還有其他的規格可以做類似的事情(實際上IdentityServer3昨天剛剛實現了另一個:http://openid.net/specs/openid-connect-logout-1_0.html),但訣竅是OP上的瀏覽器cookie需要被清除......我想不出如何做到這一點,而不在OP上) – sdoxsee

5

另外,您也可以實現跨域SSO沒有openid,只在客戶端使用JWT,如谷歌網絡應用程序。

好處是,您不需要將用戶重定向到服務器,以知道用戶是否已登錄。註銷和JWT更改可以在選項卡之間自動同步。

Authserver.com將JWT返回給example1後,將其存儲在localStorage中,但通過iframe使用中間域sso.example.com。在example1和example2中包含此iframe(指向sso.example.com)。 iframe將讀取JWT並向包含令牌的頁面發送消息。

當用戶註銷或更改活動的用戶時,iframe也可以用CORS因爲sso.example將消息發送給家長,這樣你就可以同步所有的網站(如果你想)

沒問題。 com可以訪問它的localStorage。和iframe中之間的交流,如果始發地和目的地,確認是允許(見http://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage

爲了簡化開發,我們已經發布了最近一個跨域SSO與智威湯遜在https://github.com/Aralink/ssojwt

總結你的問題,因爲這架構 1 )清理localStorage中的JWT併發送javascript事件 2)聽取事件並決定要做什麼

+0

有趣的,謝謝。 – electrotype

相關問題