簡體   English   中英

使用 Keycloak 作為授權服務器時資源服務器出現問題:“當前不支持 enc (use)”

[英]Problem with resource server when using Keycloak as an authorization server: "enc (use) is currently not supported"

我正在嘗試運行Spring Security in Action (由Laurentiu Spilca編寫)一書的第 18 章中的示例。 這是關於從授權服務器(這里是 Keycloak)獲取訪問令牌,然后對駐留在資源服務器上的資源進行操作(這里使用 Spring 安全性在 Java 中實現)。 問題是任何添加健身記錄的嘗試都會導致以下內部服務器錯誤:

{
    "error": "server_error",
    "error_description": "enc (use) is currently not supported."
}

描述:
整個場景發生在同一台機器上。 在 Keycloak (15.0.2) 中,我定義了一個 Fitnessapp 客戶端(我的應用程序),為其分配了一個具有相同名稱的 Client Scope(fitnessapp)。 我已將其訪問令牌設置為 100 分鍾的壽命。
然后我用用戶名'bill'定義一個用戶,在用戶的憑據部分中為其分配密碼'12345': 在此處輸入圖像描述 然后我在 Roles 部分定義角色 Fitnessuser。 從所選用戶的角色映射部分,我分配了 Fitnessuser。
為了使書籍示例正常工作,需要向我們的 JWT 令牌添加 3 個附加屬性:受眾、用戶名和角色
如下圖所示,我使用 Fitnessapp Client Scope 的 Mappers 部分完成了這項工作,從左到右為它們使用了相應的名稱: 在此處輸入圖像描述 由於從 Keycloak 獲取訪問令牌沒有問題,所以我只是將其包裝在上一句中,並沒有對此步驟進行更多說明。 這是配置我們的TokenStore以使用JwtTokenStore的資源服務器配置文件:

@Configuration  
@EnableResourceServer  
@EnableGlobalMethodSecurity(prePostEnabled = true)  
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {  
  
    @Value("${claim.aud}")  
    private String claimAud;  
  
    @Value("${jwkSetUri}")  
    private String urlJwk;  
  
    @Override  
    public void configure(ResourceServerSecurityConfigurer resources) {  
        resources.tokenStore(tokenStore());  
        resources.resourceId(claimAud);    
    }  
  
    @Bean  
    public TokenStore tokenStore() {  
        return new JwkTokenStore(urlJwk);  
    }  
  
    @Override  
    public void configure(HttpSecurity http) throws Exception {  
        http.authorizeRequests()  
                .mvcMatchers(HttpMethod.DELETE, "/**").hasAuthority("fitnessadmin")  
                .anyRequest().authenticated();  
    }  
}

這是將資源服務器端口 (9090) 與 Keycloak (8080) 分開的 application.properties 文件,設置公鑰和受眾的公開端點:

server.port=9090  
  
spring.datasource.url=jdbc:mysql://localhost/spring?useLegacyDatetimeCode=false&serverTimezone=UTC  
spring.datasource.username=root  
spring.datasource.password=  
spring.datasource.initialization-mode=always  
  
claim.aud=fitnessapp  
jwkSetUri=http://localhost:8080/auth/realms/master/protocol/openid-connect/certs

最后,問題出在我的 POST 請求中,該請求旨在將健身記錄添加到數據庫,但最終出現錯誤: 在此處輸入圖像描述 PS:我在 controller 中設置了一個斷點,但調試時從未達到。 所以這個問題甚至在到達 controller 之前就發生了(可能在 Spring 安全過濾器之一中)。 這就是為什么我認為沒有必要從 controller、服務或存儲庫中提供任何代碼。

問題是端點/auth/realms/master/protocol/openid-connect/certs將返回給您 2 個密鑰

  • 用途:sig——負責token簽名驗證
  • 使用:enc——負責加密

該應用程序正在抱怨,因為它無法理解第二個。 由於這只是書籍跟進和本地開發,您可以導航到Realm Settings -> Keys -> Providers inside Keycloak 並刪除負責使用的提供程序: enc

我希望答案有所幫助。

暫無
暫無

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

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