|
|
@@ -0,0 +1,121 @@
|
|
|
+package com.leanwo.gateway.util;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.UUID;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeansException;
|
|
|
+import org.springframework.beans.factory.ObjectFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
|
|
|
+import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
|
|
|
+import org.springframework.cloud.openfeign.support.SpringDecoder;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
|
|
+
|
|
|
+import com.auth0.jwt.JWT;
|
|
|
+import com.auth0.jwt.algorithms.Algorithm;
|
|
|
+import com.auth0.jwt.exceptions.JWTCreationException;
|
|
|
+import com.leanwo.gateway.exception.TokenException;
|
|
|
+
|
|
|
+import feign.RequestInterceptor;
|
|
|
+import feign.RequestTemplate;
|
|
|
+import feign.codec.Decoder;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Feign配置 使用FeignClient进行服务间调用,传递headers信息
|
|
|
+ */
|
|
|
+@Configuration
|
|
|
+public class FeignConfig implements RequestInterceptor {
|
|
|
+
|
|
|
+ private final static Logger logger = LoggerFactory.getLogger(FeignConfig.class.getName());
|
|
|
+
|
|
|
+ /** The regist overtime ms. */
|
|
|
+ // 注册超时时间
|
|
|
+ private static long REGIST_OVERTIME_MS = (long)(1 * 60 * 60 * 1000);
|
|
|
+
|
|
|
+ /** The token secret. */
|
|
|
+ // 密钥
|
|
|
+ @Value("${server.token.secret}")
|
|
|
+ private String tokenSecret;
|
|
|
+
|
|
|
+ /** The token issuer. */
|
|
|
+ // 密钥
|
|
|
+ @Value("${server.token.issuer}")
|
|
|
+ private String tokenIssuer;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void apply(RequestTemplate requestTemplate) {
|
|
|
+ LoginContext loginContext = LoginContextUtil.getLoginContext();
|
|
|
+
|
|
|
+ if (loginContext == null) {
|
|
|
+ // 临时的解决办法,后面前端会加token验证
|
|
|
+ String token = generateRegisterToken();
|
|
|
+ loginContext = new LoginContext();
|
|
|
+ loginContext.setToken(token);
|
|
|
+ loginContext.setAccountId(2L);
|
|
|
+// throw new AuthorizeException("您没有权限调用业务服务器。");
|
|
|
+ }
|
|
|
+ String token = loginContext.getToken();
|
|
|
+ logger.info("jwtToken:" + token);
|
|
|
+ if (StringUtil.isNotEmpty(token)) {
|
|
|
+ // header里面添加jwt-token
|
|
|
+ requestTemplate.header("token", loginContext.getToken());
|
|
|
+ requestTemplate.header("account", loginContext.getAccountId().toString());
|
|
|
+ logger.info("header:" + requestTemplate.headers());
|
|
|
+ }
|
|
|
+ if(loginContext.getAccountId() != null) {
|
|
|
+ requestTemplate.header("account", loginContext.getAccountId().toString());
|
|
|
+ logger.info("account:" + loginContext.getAccountId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public String generateRegisterToken() {
|
|
|
+ long currentMs = new Date().getTime();
|
|
|
+ Date expireDate = new Date(currentMs + REGIST_OVERTIME_MS);
|
|
|
+ Date notBeforeDate = new Date(currentMs + 3 * 1000);
|
|
|
+ String tokenString = null;
|
|
|
+ // Create and Sign a Token
|
|
|
+ try {
|
|
|
+ Algorithm algorithm = Algorithm.HMAC256(tokenSecret);
|
|
|
+ tokenString = JWT.create().withIssuer(tokenIssuer) // 签发者
|
|
|
+ .withExpiresAt(expireDate) // 过期时间
|
|
|
+ .withIssuedAt(new Date()) // 签发时间
|
|
|
+ // .withNotBefore(notBeforeDate) // 下次可访问的时间
|
|
|
+ .withClaim("uuid", UUID.randomUUID().toString()).sign(algorithm);
|
|
|
+ } catch (JWTCreationException exception) {
|
|
|
+ logger.error("JWT Token生成失败.", exception);
|
|
|
+ throw new TokenException("JWT Token生成失败.");
|
|
|
+ }
|
|
|
+ return tokenString;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public Decoder feignDecoder() {
|
|
|
+ return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
|
|
|
+ }
|
|
|
+
|
|
|
+ public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
|
|
|
+ final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new GateWayMappingJackson2HttpMessageConverter());
|
|
|
+ return new ObjectFactory<HttpMessageConverters>() {
|
|
|
+ @Override
|
|
|
+ public HttpMessageConverters getObject() throws BeansException {
|
|
|
+ return httpMessageConverters;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ public class GateWayMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
|
|
|
+ GateWayMappingJackson2HttpMessageConverter(){
|
|
|
+ List<MediaType> mediaTypes = new ArrayList<>();
|
|
|
+ mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));
|
|
|
+ setSupportedMediaTypes(mediaTypes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|