【问题标题】:Exposing OAuth2RestTemplate as AsyncRestTemplate将 OAuth2RestTemplate 公开为 AsyncRestTemplate
【发布时间】:2015-12-28 20:34:19
【问题描述】:

我有一个有效的 OAuth2RestTemplate 客户端(我使用的是 spring-security-oauth2 2.0.7.RELEASE)。现在我想将它公开/包装为 AsyncRestTemplate 以利用 ListenableFuture 的异步语义。不幸的是,以下简单的方法不起作用:

// instantiate and configure OAuth2RestTemplate - works
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(...);

// wrap sync restTemplate with AsyncRestTemplate - doesn't work 
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(
    new HttpComponentsAsyncClientHttpRequestFactory(), oAuth2RestTemplate);

如何为我的 HTTP 服务获取 OAuth2 Rest 客户端作为 AsyncRestTemplate?

【问题讨论】:

    标签: spring oauth spring-security resttemplate


    【解决方案1】:

    好的,我可以通过使用 OAuth2RestTemplate 中的 accessToken 手动设置“授权”标头来使 AsyncRestTemplate 工作;这是 Spring Java 配置:

    @Bean
    public OAuth2RestTemplate restTemplate() {
        ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
        // configure oauth details
    
        OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(details);
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
    
        return restTemplate;
    }
    
    @Bean
    public AsyncRestTemplate asyncRestTemplate(final OAuth2RestTemplate oAuth2RestTemplate) {
        HttpComponentsAsyncClientHttpRequestFactory asyncRequestFactory = new HttpComponentsAsyncClientHttpRequestFactory() {
            @Override
            public AsyncClientHttpRequest createAsyncRequest(URI uri, HttpMethod httpMethod) throws IOException {
                AsyncClientHttpRequest asyncRequest = super.createAsyncRequest(uri, httpMethod);
    
                OAuth2AccessToken accessToken = oAuth2RestTemplate.getAccessToken();
                asyncRequest.getHeaders().set("Authorization", String.format("%s %s", accessToken.getTokenType(), accessToken.getValue()));
    
                return asyncRequest;
            }
        };
        return new AsyncRestTemplate(asyncRequestFactory, oAuth2RestTemplate);
    }
    

    我希望有更简单的方法在 Spring 中将配置的 OAuth2RestTemplate 公开为 AsyncRestTemplate。

    【讨论】:

      【解决方案2】:

      上述方法可行,但我找到了一种更简洁的方法。 注册一个实现AsyncClientHttpRequestInterceptor

      示例代码:

      private class Oauth2RequestInterceptor implements AsyncClientHttpRequestInterceptor
      {
          private final OAuth2RestTemplate oAuth2RestTemplate;
      
          public Oauth2RequestInterceptor( OAuth2RestTemplate oAuth2RestTemplate )
          {
              this.oAuth2RestTemplate = oAuth2RestTemplate;
          }
      
          public ListenableFuture<ClientHttpResponse> intercept( HttpRequest request, byte[] body,
              AsyncClientHttpRequestExecution execution ) throws IOException
          {
              OAuth2AccessToken accessToken = oAuth2RestTemplate.getAccessToken();
              request.getHeaders()
                  .set( "Authorization", String.format( "%s %s", accessToken.getTokenType(), accessToken.getValue() ) );
              return execution.executeAsync( request, body );
          }
      }
      

      然后用你的AsyncRestTemplate注册:

      @Bean
      public AsyncRestTemplate asyncRestTemplate( AsyncClientHttpRequestFactory factory, OAuth2RestTemplate restTemplate )
      {
          AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate( factory, restTemplate );
          asyncRestTemplate.setInterceptors( Collections.singletonList( new Oauth2RequestInterceptor( restTemplate ) ) );
          return asyncRestTemplate;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-21
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2011-03-15
        相关资源
        最近更新 更多