잡동사니

반응형

질문

다음과 같이 정의 된 OAuth2RestTemplate이 있습니다.

@Configuration
@EnableOAuth2Client
public class TestOauth{
        
@Bean
public OAuth2RestTemplate restTemplate(){
OAuth2RestTemplate restTemplate= new OAuth2RestTemplate(buildResourceDetails());
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new 
HttpComponentsClientHttpRequestFactory()));
return restTemplate;
}
    
@Bean
public ClientCredentialsResourceDetails buildResourceDetails(){
ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
resourceDetails.setClientId("TestId");
resourceDetails.setClientSecret("TestSecret");
resourceDetails.setAccessTokenUri("TestURI");
return resourceDetails;
}

이제 호출 class에서 아래와 같이 주석을 달았으며 제대로 작동합니다.

@Autowired
private OAuth2RestTemplate restTemplate;

이 기능을 일반화하고 off clientId, secret 및 URI를 기반으로 템플릿을 만들고 싶습니다. 이것을 어떻게 할 수 있습니까? 여러 @bean 메서드 (각 자격 증명에 대한 별도의 메서드)를 만들고 호출자 자격 증명을 기반으로지도에서 해당 빈을 선택하는 것이이를 달성하는 유일한 방법일까요?

@bean 메소드를 하나만 유지하고 restTemplate 메소드에 매개 변수를 전달하려고했지만 [java.lang.String] 유형의 정규화 Bean을 찾을 수 없음 오류가 계속 발생합니다.

조언하십시오


답변1

3 또는 4와 같이 clientId 의 수가 적은 경우 이름이 다른 OAuth2RestTemplate유형의 여러 Bean을 사용하여 사용하는 것이 좋습니다. 이 방법을 사용하려면 다음 링크를 읽고 맵에서 여러 빈을 자동 연결하십시오.

여러 인터페이스 구현이있는 Spring Autowire Bean, 메소드에서 구현 정의

그러나 ClientId 의 수가 일부 매개 변수에 따라 동적으로 변경된다는 것을 알고 있다면 OAuth2RestTemplate유형의 하나의 Bean을 사용하고 clientId 의 값을 변경할 수 있습니다. RestTemplate 인터셉터 를 사용하여 runtime시 헤더.

Interceptor사용 방법을 알아 보려면 다음 링크를 읽으십시오.

https://howtodoinjava.com/spring-boot2/resttemplate/clienthttprequestinterceptor/

요청의 매개 변수를 기반으로 runtime에 클라이언트 ID를 전달하기로 결정한 경우 다음과 같이 할 수 있습니다.

private HttpHeaders createHttpHeaders(String clientId, String secret)
{
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.add("client_id", clientId);
    headers.add("client_secret", secret);
    return headers;
}

private void yourserviceMethod() 
{
    String theUrl = "http://blah.blah.com:8080/rest/api/blah";
    try {
        HttpHeaders headers = createHttpHeaders("clintId", "secret", "accessToken");
        HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
        ResponseEntity<String> response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, String.class);
        System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
    }
    catch (Exception eek) {
        System.out.println("** Exception: "+ eek.getMessage());
    }
}


 

 

 

 

출처 : https://stackoverflow.com/questions/63142371/creating-different-oauth2resttemplates-based-on-credentials-on-runtime

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band