다음과 같이 정의 된 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을 찾을 수 없음 오류가 계속 발생합니다.
조언하십시오
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());
}
}