Commit 77eec696 authored by 杨锐's avatar 杨锐

RestTemplate/HttpClient auth add token.

parent 4a6d0577
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
package cn.quantgroup.tech.brave.interceptor;
import cn.quantgroup.tech.brave.interceptor.job.TokenJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.protocol.HttpContext;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class HttpClientRequestInterceptor extends RequestInterceptor implements HttpRequestInterceptor {
@Override
public void process(HttpRequest httpRequest, HttpContext httpContext) {
if (auth(((HttpRequestWrapper) httpRequest).getTarget().getHostName())) {
log.info("cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor.process token = 【{}】 ", TokenJob.token);
httpRequest.addHeader(AUTH, TokenJob.token);
}
}
}
package cn.quantgroup.tech.brave.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Optional;
@Slf4j
public abstract class RequestInterceptor {
static final String AUTH = "quant-auth";
// 内网
@Value("#{'${quant.auth.http}'.split(',')}")
List<String> authHttpList;
boolean auth(String host) {
if (authHttpList == null || authHttpList.isEmpty()) {
return false;
}
return authHttpList.stream()
.map(http -> {
URL url = null;
try {
url = new URL(http);
} catch (MalformedURLException e) {
log.error("无效quant.auth.http = 【{}】", http);
}
return Optional.ofNullable(url);
})
.filter(Optional::isPresent)
.anyMatch(url -> url.get().getHost().equals(host));
}
}
package cn.quantgroup.tech.brave.interceptor;
import cn.quantgroup.tech.brave.interceptor.job.TokenJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Slf4j
@Component
public class RestTemplateRequestInterceptor extends RequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
if (auth(request.getURI().getHost())) {
log.info("cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor.intercept token = 【{}】 ", TokenJob.token);
request.getHeaders().add(AUTH, TokenJob.token);
}
return execution.execute(request, body);
}
}
package cn.quantgroup.tech.brave.interceptor.job;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Base64;
import java.util.Map;
@Data
class TokenResp {
private Integer code;
@JsonProperty("access_token")
private String token;
@JsonProperty("expires_in")
private Integer expires;
}
@Slf4j
@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "quant.auth", name = {"http", "clientId", "secret", "tokenUrl"})
public class TokenJob {
private static final String CREDENTIAL = "credential";
private static final int SUCCESS = 200;
public static String token;
@Value("${quant.auth.clientId}")
private String clientId;
@Value("${quant.auth.secret}")
private String secret;
@Value("${quant.auth.tokenUrl}")
private String tokenUrl;
@Resource
private ITechRestTemplateBuilder techRestTemplateBuilder;
@Bean
public RestTemplate restTemplate() {
return techRestTemplateBuilder.createRestTemplate();
}
@Scheduled(fixedRate = 1000 * 60 * 30)
public void getToken() {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add(CREDENTIAL, base64ForCredential());
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(requestHeaders);
TokenResp tokenResp = restTemplate().postForObject(tokenUrl, httpEntity, TokenResp.class);
log.info("getToken tokenResp = 【{}】", tokenResp);
if (tokenResp != null && SUCCESS == tokenResp.getCode() && StringUtils.isNotBlank(tokenResp.getToken())) {
token = tokenResp.getToken();
}
}
private String base64ForCredential() {
String credential = clientId + ":" + secret;
return Base64.getEncoder().encodeToString(credential.getBytes());
}
}
package cn.quantgroup.tech.brave.service.impl; package cn.quantgroup.tech.brave.service.impl;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechHttpClient; import cn.quantgroup.tech.brave.service.ITechHttpClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import javax.annotation.Resource;
/** /**
* @author zhangheng * @author zhangheng
* create on 2018.05.17 * create on 2018.05.17
*/ */
@Slf4j @Slf4j
public class TechHttpClientNoTrace implements ITechHttpClient{ public class TechHttpClientNoTrace implements ITechHttpClient{
@Resource
private HttpClientRequestInterceptor httpClientRequestInterceptor;
@Override @Override
public HttpClientBuilder createHttpClientBuilder() { public HttpClientBuilder createHttpClientBuilder() {
log.info("构建HttpClientBuilder"); log.info("构建HttpClientBuilder");
return HttpClientBuilder.create(); HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.addInterceptorFirst(httpClientRequestInterceptor);
return httpClientBuilder;
} }
} }
...@@ -2,10 +2,13 @@ package cn.quantgroup.tech.brave.service.impl; ...@@ -2,10 +2,13 @@ package cn.quantgroup.tech.brave.service.impl;
import brave.Tracing; import brave.Tracing;
import brave.httpclient.TracingHttpClientBuilder; import brave.httpclient.TracingHttpClientBuilder;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechHttpClient; import cn.quantgroup.tech.brave.service.ITechHttpClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import javax.annotation.Resource;
/** /**
* @author zhangheng * @author zhangheng
* create on 2018.05.17 * create on 2018.05.17
...@@ -18,9 +21,14 @@ public class TechHttpClientTrace implements ITechHttpClient { ...@@ -18,9 +21,14 @@ public class TechHttpClientTrace implements ITechHttpClient {
this.tracing = tracing; this.tracing = tracing;
} }
@Resource
private HttpClientRequestInterceptor httpClientRequestInterceptor;
@Override @Override
public HttpClientBuilder createHttpClientBuilder() { public HttpClientBuilder createHttpClientBuilder() {
log.info("构建brave-HttpClientBuilder"); log.info("构建brave-HttpClientBuilder");
return TracingHttpClientBuilder.create(tracing); HttpClientBuilder httpClientBuilder = TracingHttpClientBuilder.create(tracing);
httpClientBuilder.addInterceptorFirst(httpClientRequestInterceptor);
return httpClientBuilder;
} }
} }
package cn.quantgroup.tech.brave.service.impl; package cn.quantgroup.tech.brave.service.impl;
import brave.spring.web.TracingClientHttpRequestInterceptor; import brave.spring.web.TracingClientHttpRequestInterceptor;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder; import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -8,6 +9,7 @@ import org.springframework.context.annotation.Import; ...@@ -8,6 +9,7 @@ import org.springframework.context.annotation.Import;
import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -20,6 +22,8 @@ import java.util.List; ...@@ -20,6 +22,8 @@ import java.util.List;
public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder { public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder {
@Autowired @Autowired
private TracingClientHttpRequestInterceptor clientInterceptor; private TracingClientHttpRequestInterceptor clientInterceptor;
@Resource
private RestTemplateRequestInterceptor restTemplateRequestInterceptor;
@Override @Override
public RestTemplate createRestTemplate() { public RestTemplate createRestTemplate() {
...@@ -27,6 +31,7 @@ public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder { ...@@ -27,6 +31,7 @@ public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder {
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(restTemplate.getInterceptors()); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(restTemplate.getInterceptors());
interceptors.add(clientInterceptor); interceptors.add(clientInterceptor);
interceptors.add(restTemplateRequestInterceptor);
restTemplate.setInterceptors(interceptors); restTemplate.setInterceptors(interceptors);
return restTemplate; return restTemplate;
} }
......
package cn.quantgroup.tech.brave.service.impl; package cn.quantgroup.tech.brave.service.impl;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder; import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/** /**
* @author zhangheng * @author zhangheng
* create on 2018.05.17 * create on 2018.05.17
*/ */
@Slf4j @Slf4j
public class TechRestTemplateBuliderNoTrace implements ITechRestTemplateBuilder { public class TechRestTemplateBuliderNoTrace implements ITechRestTemplateBuilder {
@Resource
private RestTemplateRequestInterceptor restTemplateRequestInterceptor;
@Override @Override
public RestTemplate createRestTemplate() { public RestTemplate createRestTemplate() {
log.info("构建RestTemplate"); log.info("构建RestTemplate");
return new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(restTemplate.getInterceptors());
interceptors.add(restTemplateRequestInterceptor);
restTemplate.setInterceptors(interceptors);
return restTemplate;
} }
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<artifactId>enoch-agent-spring-boot-starter</artifactId> <artifactId>enoch-agent-spring-boot-starter</artifactId>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<version>0.2.6</version> <version>0.3.0</version>
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<lombok.version>1.16.20</lombok.version> <lombok.version>1.16.20</lombok.version>
<guava.version>23.0</guava.version> <guava.version>23.0</guava.version>
<apollo.client.version>0.10.2</apollo.client.version> <apollo.client.version>0.10.2</apollo.client.version>
<common.parent.version>0.2.6</common.parent.version> <common.parent.version>0.3.0</common.parent.version>
</properties> </properties>
<dependencies> <dependencies>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>commons-parent</artifactId> <artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId> <groupId>cn.quantgroup</groupId>
<version>0.2.6</version> <version>0.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment