簡體   English   中英

Spring 引導資源服務器無效令牌

[英]Spring Boot Resource Server Invalid Token

我正在嘗試為 Spring 項目配置 OAuth2。 我使用了 jdbc 身份驗證,我的授權服務器和資源服務器是兩個獨立的 API。 我的問題現在與微服務有關。 我正在嘗試使用此共享授權服務器來驗證微服務。 我可以從令牌端點獲取 access_token。

在此處輸入圖像描述

我可以從 check_token 端點檢查 access_token。

在此處輸入圖像描述

我的資源服務器配置:

@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
@EnableResourceServer
public class ProductApiServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductApiServiceApplication.class, args);
    }
    
}

和 application.yml:

security:
  oauth2:
    client:  
      client-id: saba-product-api-service
      client-secret: secret123 
    resource:
      id: saba-product-api-service
      token-info-uri: http://localhost:9999/uaa/oauth/check_token

和 REST controller:

    @GetMapping("/user/me")
    public Principal user(Principal principal) {
        return principal;
    } 

當我調用 /user/me 端點時,我得到了 invalid_token。

在此處輸入圖像描述

我的資源服務器日志:

在此處輸入圖像描述

我的授權服務器日志:

在此處輸入圖像描述

我的代碼有什么問題?

更新

問題是因為這段代碼:

在此處輸入圖像描述

我遇到過同樣的問題。 就我而言,我使用的是 spring 雲 oauth2,Hoxton.SR4 版本,它正在工作。 所以,我改用 Hoxton.SR6 並拋出了問題。 我的授權服務器也是 Eureka 的客戶端,問題的根源在於這種依賴關系。 在 Eureka Client 中有一個依賴,名為 jackson-dataformat-xml,因為它返回的 check_token 端點被轉換為 xml 而不是 json。 當 RemoteTokenServices 調用 check_token 時,結果是 xml,它沒有以正確的方式在 map<String,Object> 中反序列化。 如果您有多個 aud、scope 或授權,它會選擇最后一個。 並且 active 屬性被視為字符串。 在我的情況下,我解決了在授權服務器中排除 Eureka Client 提到的依賴項的問題,如下所示:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

最后,我換了

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.5.0.RELEASE</version>
</dependency>
        // gh-838
        if (map.containsKey("active") && !"true".equals(String.valueOf(map.get("active")))) {
            logger.debug("check_token returned active attribute: " + map.get("active"));
            throw new InvalidTokenException(accessToken);
        }

暫無
暫無

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

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