2017-09-14 471 views
0

我試圖讓nodeJS keycloak adapter與我的Express應用程序一起工作,但當它試圖重定向到我用keycloak中間件保護的路由的登錄頁面時遇到CORS問題:Keycloak CORS問題重定向登錄

XMLHttpRequest無法加載 http://192.168.132.44:8080/auth/realms/Actora/protocol/openid-connect/auth?client_id=actora-test&state=0e9c9778-c41b-4aa8-8052-d0f0125045ac&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Fauth%2Fchecktoken%3Fauth_callback%3D1&scope=openid&response_type=code。 對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在「訪問控制 - 允許來源」標頭。原因'http://localhost:5001'因此不允許 訪問。

在我的keycloak客戶端設置中,我在Web起源配置部分添加了一個'*'值。

我也能使用節點CORS庫在我的節點Express應用程序CORS,這明確指導here

var cors = require('cors'), 
    app = express(); 

app.use(cors()); 
app.options('*', cors()); //enable for all pre-flight requests 
我使用keycloak的3.2.1版本

的情況下,有什麼差別如下(我看到了新版本作爲RC)

有沒有人遇到類似的問題,並設法解決?我一直在挖掘很多JBOSS郵件列表線程和其他的stackoverflows,並且似乎都建議這麼做,就像在keycloak管理站點上爲客戶端的web起始配置部分添加'*'條目一樣簡單,但事實並非如此我。

謝謝

+0

的'http://192.168.132.44:8080/auth/realms/Actora/protocol/openid-connect/auth'端點不是由您的節點應用程序提供的,對吧?它是由運行JBOSS的其他服務器提供的? – sideshowbarker

+0

正確,那麼這是否意味着其他服務器需要某種形式的CORS啓用,即我們的keycloak正在運行的JBOSS? – mindparse

+0

不應該不需要,你能否提供關於你的NodeJS應用程序的更多細節,你如何爲前端服務?或者是一個單獨的Web應用程序?你是否僅使用承載者? –

回答

1

我也在用mindparse處理這個問題。

我認爲這裏的關鍵問題是keycloak服務器沒有響應任何ACCESS-CONTROL-ALLOW-ORIGIN頭,儘管他已經在keycloak管理門戶中正確配置了「web起源」設置。

在這個過程中的深度流的更是:

  1. 的用戶試圖呼叫一個keycloak固定路線的節點明確服務器上
  2. Keycloak中間件檢測到用戶沒有被授權, 響應302(重定向)到keycloak服務器託管 的自定義登錄頁面的請求。
  3. 瀏覽器向keycloak服務器發送OPTIONS請求,以檢查它是否爲 ,因爲它是跨源請求。
  4. keycloak服務器響應不包含ACCESS-CONTROL-ALLOW- ORIGIN標頭,告訴瀏覽器它有權發出此 請求。
  5. 然後瀏覽器讀取此響應,因此不會使後續 了請求,因爲它沒有通過訪問控制允許起源檢查
+0

您可以詳細步驟1嗎?我懷疑你做了一個XMLHttpRequest,這對重定向沒有意義。只有瀏覽器直接執行重定向(不通過ajax調用),重定向纔有意義。請參閱我以前對OP的評論,以獲取有關此方面的好方法。 –

+0

這是正確的。我們有一個角度應用程序,用於在任何角度狀態導航到時檢查用戶是否登錄。這意味着,當用戶瀏覽到瀏覽器中的網站時,它會立即在我們的快遞服務器上對我們的checktoken方法進行調用。 但是從你所說的話來看,它聽起來像是不可能以我們正在嘗試的方式/流程來保護api資源?您必須先保護客戶端,然後使用客戶端的令牌訪問服務? – Andy