2017-04-23 16 views
0

한 ResourceServer에서 다른 ResourceServer로 통신하는 동안 Token Relay에 문제가 있습니다.스프링 보안 OAuth2 JWT 토큰 릴레이 문제

My AuthServer는 Dave Sayer의 샘플을 기반으로하며 이는 리소스 server1에 대한 application.yml입니다. 그것은 내가 자원 서버 1에서 OAuth2RestTemplate을 만드는 오전 방법은 다음과

는 다른 클라이언트 ID를 사용하는 것을 제외하고

security: 
user: 
    password: none 
    oauth2: 
    client: 
     accessTokenUri: http://localhost:9999/uaa/oauth/token 
     userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize 
     clientId: trusted 
     clientSecret: secret 

는 config는 자원 서버 2에서 매우 유사하다.

@LoadBalanced 
@Bean 
@Autowired 
public OAuth2RestTemplate loadBalancedOauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, 
                 OAuth2ProtectedResourceDetails details) { 
    return new OAuth2RestTemplate(details, oauth2ClientContext); 
} 

이 호출에는 JWT OAuth2 토큰 릴레이가 필요하지만 아마도 발생하지 않을 것입니다.

@GetMapping("/test-relay") 
public String fetchMyProfile2() { 
    final ResponseEntity<String> forEntity = oauthRestTemplate.getForEntity("http://my-oauth/users/me", String.class); 
    final String body = forEntity.getBody(); 
    System.out.println("body = " + body); 
    return body; 
} 

은 우체부 위해 RESTClient에서이 엔드 포인트 /test-relay를 호출하는 동안 내가 얻을 예외입니다. 전화를하는 동안 Authorization Header에 JWT Token을 지정하고 있습니다.

org.springframework.security.oauth2.client.resource.UserRedirectRequiredException: A redirect is required to get the users approval 
at org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.getRedirectForAuthorization(AuthorizationCodeAccessTokenProvider.java:359) 
at org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.obtainAccessToken(AuthorizationCodeAccessTokenProvider.java:205) 
at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:148) 
at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:121) 
at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:221) 
at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:173) 
at org.springframework.security.oauth2.client.OAuth2RestTemplate.createRequest(OAuth2RestTemplate.java:105) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:648) 
at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128) 

저는 스프링 부트 1.5.2/3을 사용하고 있습니다. 내 리소스 서버는 UI 서버이기도하며, 웹 브라우저를 사용하여 URL을 방문하면이 호출이 올바르게 작동합니다.

UPDATE -1-

이 문제는 너무 즉 그것에 @EnableOAuth2Sso 주석 본와 UI 서버 인 리소스 서버에 대해 일어난다. @EnableOAuth2Sso이없는 순수한 리소스 서버의 경우 토큰 릴레이가 완벽하게 작동합니다.

답변

0

내가보고 한 버그의 영향을받을 수도 있습니다 https://github.com/spring-cloud/spring-cloud-security/issues/123. 이 대안이 도움이되는지 확인하십시오.

@Configuration 
public class WorkaroundConfig extends WebMvcConfigurerAdapter { 

    @Autowired 
    @Qualifier("tokenRelayRequestInterceptor") 
    HandlerInterceptor handlerInterceptor; 

    @Override 
    public void addInterceptors (InterceptorRegistry registry) { 
     registry.addInterceptor(handlerInterceptor); 
    } 

} 
+0

이 해결 방법은 현재 당면 과제를 해결했습니다. 도와 주셔서 감사합니다. ui 서버를 리소스 서버로 노출하는 것이 좋습니다. –

+0

안녕하세요, UI를 리소스 서버로 설정하는 것이 좋습니다. –

관련 문제