복붙노트

[SPRING] oauth2 OAuth2AccessToken 요청에 대한 프록시 설정 방법 또는 OAuth2AccessTokenSupport restTemplate 변수를 재정의하는 방법?

SPRING

oauth2 OAuth2AccessToken 요청에 대한 프록시 설정 방법 또는 OAuth2AccessTokenSupport restTemplate 변수를 재정의하는 방법?

나는 다음과 같은 방법으로 네트워크 프록시를 설정하려했지만, 아무 것도 작동하지 않았다.

1 : jvm 변수를 -Dhttp.proxyHost = -Dhttp.proxyPort = .......와 같이 설정하십시오. 2 : 콩을 만들었습니다.

@Bean
public RestTemplate restTemplate() {
    final String proxyHost = "######"; // host
    final int proxyPort = ####;  // port
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setProxy(new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)));
    return new RestTemplate(factory);
}

그러나이 구성은 OAuth2AccessTokenSupport.restTemplate에 의해 무시됩니다.

따라서 아래의 메소드는 항상 새로 생성 된 나머지 템플릿 객체를 반환합니다.

org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport

protected RestOperations getRestTemplate() {
    if (restTemplate == null) {
        synchronized (this) {
            if (restTemplate == null) {
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.setErrorHandler(getResponseErrorHandler());
                restTemplate.setRequestFactory(requestFactory);
                restTemplate.setInterceptors(interceptors);
                this.restTemplate = restTemplate;
            }
        }
    }
    if (messageConverters == null) {
        setMessageConverters(new RestTemplate().getMessageConverters());
    }
    return restTemplate;
}

OAuth 클라이언트 애플리케이션에서 나머지 템플릿에 대한 프록시를 재정의하거나 설정하도록 도와주세요.

해결법

  1. ==============================

    1.이것은 간단한 해결책이 아닐 수도 있습니다. 그러나 마침내 아래 코드에 의해 oauth 요청에 대한 프록시를 설정할 수있었습니다.

    이것은 간단한 해결책이 아닐 수도 있습니다. 그러나 마침내 아래 코드에 의해 oauth 요청에 대한 프록시를 설정할 수있었습니다.

    필터 등록

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.antMatcher("/**")
        .authorizeRequests().antMatchers("/webjars/**", "/scripts/**", "/styles/**", "/instances/**", "/#/invalid").permitAll()
        .anyRequest().authenticated()
        .and().csrf().csrfTokenRepository(csrfTokenRepository())
        .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
        .addFilterBefore(oauthFilter(), BasicAuthenticationFilter.class);
        // @formatter:on
        super.configure(http);
    }
    

    인증 필터

    @Autowired
    OAuth2ClientContext oauth2ClientContext;
    
    @Autowired
    OAuth2ProtectedResourceDetails resource;
    
    @Autowired
    ResourceServerProperties resourceServer;
    
    @Autowired
    RequestHelper requestHelper;
    
    private Filter oauthFilter() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
        OAuth2ClientAuthenticationProcessingFilter oauthFilter = new OAuth2ClientAuthenticationProcessingFilter("/login");
        OAuth2RestTemplate oauthTemplate = new OAuth2RestTemplate(resource, oauth2ClientContext);
        OAuth2AccessTokenSupport authAccessProvider = new AuthorizationCodeAccessTokenProvider();
        // Set request factory for '/oauth/token'
        authAccessProvider.setRequestFactory(requestHelper.getRequestFactory());
        AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
                (AuthorizationCodeAccessTokenProvider)authAccessProvider));
        oauthTemplate.setAccessTokenProvider(accessTokenProvider);
        // Set request factory for '/userinfo'
        oauthTemplate.setRequestFactory(requestHelper.getRequestFactory());
        oauthFilter.setRestTemplate(oauthTemplate);
        UserInfoTokenServices userInfoTokenService = new UserInfoTokenServices(resourceServer.getUserInfoUri(), resource.getClientId());
        userInfoTokenService.setRestTemplate(oauthTemplate);
        oauthFilter.setTokenServices(userInfoTokenService);
        return oauthFilter;
    }
    

    도우미 코드 요청

    @Configuration
    public class RequestHelper {
    
      @Value("${proxy.hostname}")
      private String proxyHost;
    
      @Value("${proxy.port}")
      private int proxyPort;
    
      @Value("${proxy.username}")
      private String proxyUser;
    
      @Value("${proxy.password}")
      private String proxyPassword;
    
      @Value("${useProxy}")
      private boolean useProxyFlag;
    
      @Value("${skipSslValidation}")
      private Boolean skipSslValidationFlag;
    
      public HttpComponentsClientHttpRequestFactory getRequestFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
    
          HttpClientBuilder httpClientBuilder = HttpClients.custom();
    
          // Skip SSL validation based on condition
          if (skipSslValidationFlag) {
              TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
    
              SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
                      .loadTrustMaterial(null, acceptingTrustStrategy)
                      .build();
              SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
    
              httpClientBuilder = httpClientBuilder.setSSLSocketFactory(csf);
          }
    
          // Set proxy based on condition
          if (useProxyFlag) {
              CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
              credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyUser, proxyPassword));
              httpClientBuilder = httpClientBuilder.setProxy(new HttpHost(proxyHost, proxyPort));
              httpClientBuilder = httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
          }
    
          CloseableHttpClient httpClient = httpClientBuilder.build();
          HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
          requestFactory.setHttpClient(httpClient);
          return requestFactory;
      }
    }
    
  2. ==============================

    2.이 작업을 수행하는 또 다른 방법은 OAuth2RestTemplate에 사용자 지정 AccessTokenProvider를 설정하는 것입니다. 아래 코드 샘플에서는 SSL 유효성 검사가 무시됩니다.

    이 작업을 수행하는 또 다른 방법은 OAuth2RestTemplate에 사용자 지정 AccessTokenProvider를 설정하는 것입니다. 아래 코드 샘플에서는 SSL 유효성 검사가 무시됩니다.

    @Configuration
    public class ConfigLocal {
    
        @Value("${https.proxyHost}")
        private String proxyHost;
    
        @Value("${https.proxyPort}")
        private Integer proxyPort;
    
        @Value("${https.proxyUser}")
        private String proxyUser;
    
        @Value("${https.proxyPassword}")
        private String proxyPassword;
    
        @Bean
        public OAuth2RestTemplate oauth2RestTemplate(ClientCredentialsResourceDetails clientCredentialsResourceDetails)
                throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException {
            OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(clientCredentialsResourceDetails);
    
            // Instanciate a new http client with proxy configuration, and bypass SSL Certificate verification
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyUser, proxyPassword));
    
            HttpClientBuilder httpClientBuilder =
                    HttpClients.custom()
                            .setProxy(new HttpHost(proxyHost, proxyPort))
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setSSLHostnameVerifier(new NoopHostnameVerifier())
                                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true)
                                        .build());
    
            // requestFactory
            HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build());
            ClientCredentialsAccessTokenProvider clientCredentialsAccessTokenProvider = new ClientCredentialsAccessTokenProvider();
            clientCredentialsAccessTokenProvider.setRequestFactory(requestFactory);
    
            // accessTokenProvider
            AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
                    new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(),
                    new ResourceOwnerPasswordAccessTokenProvider(), clientCredentialsAccessTokenProvider));
    
            restTemplate.setAccessTokenProvider(accessTokenProvider);
    
            return restTemplate;
        }
    }
    
  3. from https://stackoverflow.com/questions/37854133/how-to-set-proxy-on-spring-oauth2-oauth2accesstoken-request-or-how-to-override-o by cc-by-sa and MIT license