Spring Boot资源服务器无效令牌

时间:2020-07-14 13:11:15

标签: java spring spring-boot oauth authorization

我正在尝试为Spring项目配置OAuth2。我使用了jdbc身份验证,而我的授权服务器和资源服务器是两个单独的API。我的问题现在是微服务。我正在尝试使用此共享授权服务器对微服务进行身份验证。我可以从令牌端点获取access_token。

enter image description here

我可以从check_token端点检查access_token。

enter image description here

我的资源服务器配置:

@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控制器:

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

当我呼叫/ user / me端点时,我得到了invalid_token。

enter image description here

我的资源服务器日志:

enter image description here

我的授权服务器日志:

enter image description here

我的代码有什么问题?

更新

问题在于此代码:

enter image description here

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。就我而言,我使用的是 spring cloud oauth2、Hoxton.SR4 版本并且它正在工作。因此,我更改为 Hoxton.SR6 并且问题被抛出。我的授权服务器也是 Eureka 的客户端,问题是由这种依赖性引起的。 Eureka Client 中有一个依赖项,名为 jackson-dataformat-xml,并且因为它,check_token 端点的返回被转换为 xml 而不是 json。当 RemoteTokenServices 调用 check_token 并且结果是一个 xml 时,它不能以正确的方式在 map 中反序列化。如果您有多个审计、范围或权限,它会选择最后一个。并且活动属性被视为字符串。就我而言,我解决了在授权服务器中排除 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>

答案 1 :(得分:0)

最后,我替换了

<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);
        }