2016-08-18 3 views
5

두 개의 리소스 서버가 있습니다. 하나는 전자 메일 알림 API이고 다른 하나는 예약 된 작업을 실행하는 리소스 서버입니다. 예약 된 작업이 시작되면 사용자에게 작업이 시작되었음을 알리기 위해 이메일 서비스에 전화를 겁니다. 두 서비스 모두 인증을 위해 OAuth2를 사용합니다. Get token예약 된 작업에서 OAuth2RestTemplate을 어떻게 사용할 수 있습니까?


Call service

이를 위해, 나는 봄 보안과 봄 부팅을 사용하고 있습니다 : 그것을 제시하여 액세스 토큰을 얻을 수 있도록 예약 된 작업 서비스가 클라이언트의 자격 증명을 설정 한 클라이언트 자격 증명입니다 OAuth2. Task 서비스에는 OAuth2RestTemplate이있어 이메일 서비스로 전화를 겁니다. 예약 된 작업이 실행되어 OAuth2RestTemplate을 사용하려고 시도하면 OAuth2ClientContext를 Sesson 범위의 Bean으로 가져옵니다. 분명히 요청 스레드 내에서 실행되지 않기 때문에 하나를 찾지 않을 것입니다. 백그라운드 작업 스레드에서 작업하고 있습니다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
    'scopedTarget.oauth2ClientContext': Scope 'session' is not active for the current thread; 
    consider defining a scoped proxy for this bean if you intend to refer to it 
    from a singleton 

나는 시스템 간 인증을위한 정적 클라이언트 자격 증명을 사용하고 있기 때문에, 내 액세스 토큰을 처리하기 위해 세션 범위 데이터를 사용하는 좋은 이유가 표시되지 않습니다 :이 예외를 얻을. 모든 스레드가 OAuth2RestTemplate을 통해 요청을 만들 때 사용할 수있는 싱글 톤 OAuth2ClientContext Bean을 선호합니다.

어떻게 구성 할 수 있습니까?

+0

비슷한 일을해야합니다. Quartz 스케쥴러는 OAuth2 보호 REST 서비스에 액세스 할 작업을 호출해야합니다. 나는 OAuth2 흐름을 기반으로하는 사용자 이름/암호를 사용할 수 없지만 클라이언트 ID 기반 흐름을 사용할 수 있습니다. 코드를 공유 할 수 있습니까? 아니면 도움이 될까요? – sunitkatkar

답변

4

꽤 간단합니다. 나는 싱글 콩을 원했다, 그래서 싱글 콩 만들어 내 @Configuration 클래스에두고

@Primary 
@Bean 
public OAuth2ClientContext singletonClientContext() { 
    return new DefaultOAuth2ClientContext(); 
} 

을, 봄 내 OAuth2RestTemplate에 그것을 유선 및 나의 예약 된 작업은 이메일 서비스를 호출 할 수 있었다. 좋은 측정을 위해, 주석을 추가하여이 빈이 Spring 부트가 만든 것보다 선호되도록했습니다 (필요한 경우 확실하지 않음).

+0

'@ Primary'는 필요 없습니다. "정상적인"bean은 Boot의 auto-configured equivalent를 스위치 온하기에 충분하다. –

관련 문제