2017-10-16 167 views
0

我嘗試使用Spring Boot和Keycloak作爲AuthService來實現一個簡單的OAuth2「使用簽名JWT」客戶端身份驗證的演示應用程序。在Spring Boot中使用Keycloak實現JWT,JWE和JWS(簽名JWT)

的理念是:

  1. 一個安全的REST服務 「生產者」
    • 提供端點GET /人所有用戶/與角色 「read_person」
    • 校長提供一個端點POST /個人角色爲「write_person」的所有用戶/負責人
  2. 另一個(無擔保)REST服務「The Consumer」
    • 提供了一個enpoint/API開放給大家
    • 使用RequestInterceptor傳遞的accessToken(簽署JWT/JWS)

我讀通過Feign客戶端調用內部的 「生產者」文檔:

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/client-authentication.html

說:

一旦客戶端應用程序啓動時,它允許使用URL如http://myhost.com/myapp/k_jwks,>假設http://myhost.com/myapp是你的客戶的基礎URL>應用程序下載在JWKS格式公共>鍵。這個URL可以被Keycloak使用(見下文)。

在認證過程中,客戶端生成一個JWT令牌,並使用>其私鑰對其進行簽名,並將其發送到Keycloak中client_assertion>參數中特定backchannel>請求(例如,代碼到令牌請求)。

我搜索了很多關於這個主題的教程/演示或文檔,但到目前爲止失敗了。 所以在這裏我的問題:

  1. 如何實現這個 「k_jwk」 終點?在「製片人」中,我自己簡單地製作一個@RestController嗎?如何配置Keycloak以瞭解此URL?

  2. 我該如何實施我的「消費者」才能從Keycloak獲得新簽署的智威湯遜?

更新 即將移除刺激性PS聲明。

+0

爲什麼要重新實現這一切,因爲我們已經做在春節引導適配器? –

+0

請告訴我如何在這裏使用Keycloak Adapater。我找不到任何演示或文檔。 – HaVonTe

+0

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/spring-boot-adapter.html,同時檢查我的博客帖子https://developers.redhat.com/blog/2017/ 05/25 /輕鬆保護您的彈簧啓動應用程序與keycloak /或我們的快速入門https://github.com/keycloak/keycloak-quickstarts –

回答

1
  1. 你並不需要實現k_jwk終點,這是由適配器處理。 Keycloak在默認情況下會看到http:///your.app.com/k_jwk(但如果需要,您可以在控制檯中覆蓋)。 然後,您需要配置您的Spring Boot客戶端,只需使用與keycloak.json相同的屬性,但在應用程序中。屬性格式:

    ...

    keycloak.credentials.jwt.client-密鑰庫文件=類路徑:密鑰庫client.jks keycloak.credentials.jwt.client-密鑰庫型= JKS

    等等

  2. 你需要一個令牌來調用producer但正如你所說的切入點將是一個insecured端點所以你可能要使用這個Service Account

我希望這會有所幫助。

+0

好的,thx。第一個信息非常方便。我將嘗試瞭解並實施此服務帳戶主題。 – HaVonTe

+0

我可能需要進一步的幫助。 我使用正確的keycloak設置和gradle依賴項中的適配器設置了一個客戶端應用程序。我創建了Feign客戶端(RestTemplate對我來說也不錯)。怎麼辦?我如何生成智威湯遜? 我不明白與服務帳戶的提示。該文檔說: http://www.keycloak.org/docs/2.5/server_admin/topics/clients/oidc/service-accounts.html 總結:從keycloak抓取令牌 POST/auth/realms/demo /協議/ openid連接/令牌 所以我必須寫這個由我自己? – HaVonTe

+0

是的,如果你想使用簽名JWT作爲客戶端認證,可能需要做一些手動工作,但你可以利用這個類來獲得jwt令牌https://github.com/keycloak/keycloak/blob/master/適配器/ OIDC /適配器核/ src目錄/主/ JAVA /組織/ keycloak /適配器/認證/ JWTClientCredentialsProvider.java –

0

更新

我想不出解決這個問題,但瞭解singned智威湯遜一些事情的平均時間:

  1. 通過創建一個JSON結構創建一個所謂的「承載令牌」並附上所有必要的聲明(sub,nbf,exp ...),並使用Keycloak的JKS/Private Key對其進行簽名/證明。 Keycloak旁邊有一些不錯的第三方庫可以做到這一點。

  2. 從Keycloak得到一個真正的accessToken(JWE/JWS):發送此靜態最終承載令牌在/認證/境界/ $境界/協議/ OpenID的連接/令牌Keycloak /內省

與QueryParams:

grant_type = client_credentials & client_assertion_type =甕%3Aietf%3Aparams%3Aoauth%3Aclient斷言型%3Ajwt承載& client_assertion = $ BEARER_TOKEN

  • 使用接收真正的accessToken訪問ResourceServer ...