簡體   English   中英

使用 Keycloak SSO 在 2 個應用程序之間保持身份驗證

[英]Keep authentication between 2 applications with Keycloak SSO

我有 2 個 JHipster 應用程序,每個應用程序在一個子域(app1.domain.tld 和 app2.domain.tld)上運行。

在這兩個應用程序中,用戶都通過 Keycloak 登錄。 順序是這樣的:

  1. Angular 應用程序向 Keycloak 發送帶有憑據的 /authenticate 請求
  2. 如果響應成功,則返回身份驗證 cookie
  3. POST 請求被發送到生成 JSessionID cookie 的 Jhipster 后端應用程序
  4. JSessionID 然后用於對支持的應用程序的每個請求。

如果用戶已經登錄域 (*.domain.tld) 的應用程序之一,那么自動登錄用戶(無需詢問用戶名和密碼)的最佳方法是什么?

在理解它僅適用於它生成的應用程序之前,我嘗試將 JSessionID 用作全局令牌...

也許捕獲 Keycloak 身份驗證 cookie(在第 2 步返回)並在第二個應用程序上進行身份驗證可以解決問題?

從我在測試時看到的情況來看,在第一個應用程序上通過身份驗證后,當我轉到第二個應用程序時,Angular 401 HTTP 攔截器重定向到帶有會話令牌的 keycloak 登錄頁面。 因此,那時 Keycloak 應該看到我已經登錄並且應該將我重定向到我的第二個應用程序的主頁。

我對嗎 ?

javascript 適配器通過創建一個從身份驗證服務器加載的iframe來解決這個問題。

來自keycloak 文檔

會話狀態 iframe

默認情況下,JavaScript 適配器會創建一個隱藏的 iframe,用於檢測是否發生了單點注銷。 這不需要任何網絡流量,而是通過查看特殊狀態 cookie 來檢索狀態。 可以通過在傳遞給 init 方法的選項中設置 checkLoginIframe: false 來禁用此功能。您不應依賴於直接查看此 cookie。 它的格式可以更改,並且還與 Keycloak 服務器的 URL 相關聯,而不是您的應用程序。

init 函數的成功回調有一個參數,用於給出用戶的身份驗證狀態。

<script src="keycloak.js"></script>
<script>
    var keycloak = Keycloak();
    keycloak.init().success(function(authenticated) {
        alert(authenticated ? 'authenticated' : 'not authenticated');
    }).error(function() {
        alert('failed to initialize');
    });
</script>

如果用戶通過身份驗證,則將用戶重定向到登錄頁面,因為用戶已經通過身份驗證,因此無需再次輸入登錄憑據。 如果使用 onload 選項check-sso初始化,則適配器可以自動處理此問題

有關 javascript 適配器內部工作原理的更多詳細信息,可以在此處找到源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM