簡體   English   中英

在Spring Boot中使用Keycloak實現JWT,JWE和JWS(簽名的JWT)

[英]Implementing JWT, JWE and JWS (signed JWT) with Keycloak in Spring Boot

我嘗試使用Spring Boot和Keycloak作為AuthService來實現一個簡單的OAuth2“使用簽名的JWT進行客戶端身份驗證”演示應用程序。

這個想法是:

  1. 一項安全的REST服務“生產者”
    • 為所有具有角色“ read_person”的用戶/主體提供端點GET / person
    • 為所有用戶/角色提供端點POST / person,角色為“ write_person”
  2. 另一個(不安全的)REST服務“消費者”
    • 為所有人提供一個enpoint / api開放
    • 通過Feign客戶端使用RequestInterceptor調用內部的“生產者”以傳遞AccessToken(簽名的JWT / JWS)

我閱讀了有關文檔:

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

他說:

客戶端應用程序啟動后,就可以使用http://myhost.com/myapp/k_jwks之類的URL以JWKS格式下載其公共密鑰,前提是假定http://myhost.com/myapp是基礎您的客戶端>應用程序的URL。 Keycloak可以使用此URL(請參見下文)。

在身份驗證期間,客戶端會生成一個JWT令牌,並使用其私鑰對其進行簽名,然后在client_assertion>參數中的特定反向通道請求(例如,代碼令牌請求)中將其發送到Keycloak。

我在Google上進行了大量搜索,以找到有關此主題的教程/演示或文檔,但到目前為止仍失敗。 所以這是我的問題:

  1. 如何實現此“ k_jwk”端點? 我是否自己在“生產者”中簡單地構建@RestController 如何配置Keycloak來了解此URL?

  2. 如何實現我的“消費者”以從Keycloak獲得新的簽名JWT?

更新刪除了煩人的PS語句。

  1. 您不需要實現k_jwk端點,這是由適配器處理的。 默認情況下,Keycloak將查看http:///your.app.com/k_jwk (但如果需要,您可以在控制台中覆蓋它)。 然后,您需要配置Spring Boot客戶端,只需使用與keycloak.json相同的屬性,但格式為application.properties:

    ...

    keycloak.credentials.jwt.client-keystore-file = classpath:keystore-client.jks keycloak.credentials.jwt.client-keystore-type = JKS

    等...

  2. 您需要一個令牌來調用producer但是正如您所說的,入口點將是一個不安全的端點,因此您可能要為此使用服務帳戶

我希望這將有所幫助。

更新

我無法解決此問題,但與此同時了解了一些關於JWT的知識:

  1. 通過自己創建具有所有必要聲明(sub,nbf,exp ...)的Json結構並使用Keycloak的JKS /私鑰對其進行簽名/驗證,從而創建所謂的“承載者令牌”。 在Keycloak旁邊有一些不錯的第三方庫可以做到這一點。

  2. 要從Keycloak獲取真實的AccessToken(JWE / JWS):在/ auth / realms / $ realm / protocol / openid-connect / token / introspect將此靜態最終承載令牌發送到Keycloak

使用QueryParams:

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

  1. 使用接收到的真實AccessToken訪問ResourceServer ...

暫無
暫無

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

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