|  | @ -1,208 +0,0 @@
 | 
	
		
			
				|  |  | package gateway.processor;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.fasterxml.jackson.databind.JsonNode;
 | 
	
		
			
				|  |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
	
		
			
				|  |  | import com.yihu.hos.core.datatype.StringUtil;
 | 
	
		
			
				|  |  | import com.yihu.hos.core.http.HTTPResponse;
 | 
	
		
			
				|  |  | import com.yihu.hos.core.http.HttpClientKit;
 | 
	
		
			
				|  |  | import org.apache.camel.Body;
 | 
	
		
			
				|  |  | import org.apache.camel.Exchange;
 | 
	
		
			
				|  |  | import org.apache.camel.Processor;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.io.IOException;
 | 
	
		
			
				|  |  | import java.text.ParseException;
 | 
	
		
			
				|  |  | import java.text.SimpleDateFormat;
 | 
	
		
			
				|  |  | import java.util.Calendar;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | import java.util.stream.Stream;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | public class GatewayProcessor implements Processor {
 | 
	
		
			
				|  |  |     static Map<String, AppApi> apiMap = new HashMap<>();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void process(Exchange exchange) throws Exception {
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public String secret(@Body String body, Exchange exchange) throws IOException, ParseException {
 | 
	
		
			
				|  |  |         System.out.println(body);
 | 
	
		
			
				|  |  |         String appKey = exchange.getIn().getHeaders().get("appKey").toString();
 | 
	
		
			
				|  |  |         return "restlet:http://sdw2:10000/api/v1.0/admin/apps/" + appKey;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public String route(@Body Map<String, Object> body, Exchange exchange) throws IOException, ParseException {
 | 
	
		
			
				|  |  | //        body = URLDecoder.decode(body, "UTF-8");
 | 
	
		
			
				|  |  |         if ("true".equals(body.get("successFlg"))) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/paramError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         Map<String, Object> obj = (Map) body.get("obj");
 | 
	
		
			
				|  |  |         if (obj == null) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/paramError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         String secret = obj.get("secret").toString();
 | 
	
		
			
				|  |  |         Map<String, Object> params = exchange.getIn().getHeaders();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         boolean pass = checkParams(params);
 | 
	
		
			
				|  |  |         if (!pass) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/paramError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         pass = checkTimeStamp(params);
 | 
	
		
			
				|  |  |         if (!pass) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/outdataError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         pass = checkSign(params, secret);
 | 
	
		
			
				|  |  |         if (!pass) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/signValidError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         pass = checkAuthorized(params);
 | 
	
		
			
				|  |  |         if (!pass) {
 | 
	
		
			
				|  |  |             return "jetty:http://0.0.0.0:9999/error/unauthorizedError";    //TODO:
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return genEndpoint(params, exchange);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private boolean checkParams(Map<String, Object> params) {
 | 
	
		
			
				|  |  |         Object api = params.get("api");                     // API接口名称
 | 
	
		
			
				|  |  |         Object sign = params.get("sign");                     // 簽名
 | 
	
		
			
				|  |  |         Object timestamp = params.get("timestamp");        // 时间戳
 | 
	
		
			
				|  |  |         Object appKey = params.get("appKey");               // HOP分配给应用的AppKey ,创建应用时可获得
 | 
	
		
			
				|  |  |         Object version = params.get("v");                   // API协议版本
 | 
	
		
			
				|  |  |         return !(StringUtil.isEmpty(api) || StringUtil.isEmpty(timestamp)
 | 
	
		
			
				|  |  |                 || StringUtil.isEmpty(appKey) || StringUtil.isEmpty(version)
 | 
	
		
			
				|  |  |                 || StringUtil.isEmpty(sign));
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private boolean checkTimeStamp(Map<String, Object> params) throws ParseException {
 | 
	
		
			
				|  |  |         final long ONE_MIN = 60000; //millisecond
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         String timestamp = params.get("timestamp").toString();
 | 
	
		
			
				|  |  |         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         java.util.Date ts = format.parse(timestamp);
 | 
	
		
			
				|  |  |         if (ts == null) {
 | 
	
		
			
				|  |  |             return false;   //时间格式不正确
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         Calendar date = Calendar.getInstance();
 | 
	
		
			
				|  |  |         long timeInMillis = date.getTimeInMillis();
 | 
	
		
			
				|  |  |         java.util.Date min = new java.util.Date(timeInMillis - 5 * ONE_MIN);
 | 
	
		
			
				|  |  |         java.util.Date max = new java.util.Date(timeInMillis + 5 * ONE_MIN);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return ts.after(min) && ts.before(max);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private boolean checkSign(Map<String, Object> params, String secret) {
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             String sign = params.get("sign").toString();                     // 簽名
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             ParamVerifyBean paramSign = new ParamVerifyBean();
 | 
	
		
			
				|  |  |             paramSign.addParam(params);
 | 
	
		
			
				|  |  | //            paramSign.genParam();
 | 
	
		
			
				|  |  |             //TODO 获取app secret传入验证
 | 
	
		
			
				|  |  |             String md5Sign = paramSign.signParam(secret);
 | 
	
		
			
				|  |  |             if (!md5Sign.equals(sign)) {
 | 
	
		
			
				|  |  |                 System.out.println("传递的签名:" + sign);
 | 
	
		
			
				|  |  |                 System.out.println("生成的签名:" + md5Sign);
 | 
	
		
			
				|  |  |                 return false;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             return true;
 | 
	
		
			
				|  |  |         } catch (Exception e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private boolean checkAuthorized(Map<String, Object> params) {
 | 
	
		
			
				|  |  |         ObjectMapper objectMapper = new ObjectMapper();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         HTTPResponse response = HttpClientKit.get("http://localhost:10000/api/v1.0/admin/appApiAuth?appId=" + params.get("appKey") + "&apiName="+ apiMap.get("api"));
 | 
	
		
			
				|  |  |         if (response.getStatusCode() != 200) {
 | 
	
		
			
				|  |  |             System.out.println("验证API权限,请求失败!");
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             Map map = objectMapper.readValue(response.getBody(), Map.class);
 | 
	
		
			
				|  |  |             if ((Boolean) map.get("successFlg")){
 | 
	
		
			
				|  |  |                 return true;
 | 
	
		
			
				|  |  |             }else {
 | 
	
		
			
				|  |  |                 System.out.println("验证失败:"+map.get("errorMsg"));
 | 
	
		
			
				|  |  |                 return false;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         } catch (IOException e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private Map<String, String> parseBody(String body) throws IOException {
 | 
	
		
			
				|  |  |         return Stream.of(body.split("&")).map(obj -> obj.split("="))
 | 
	
		
			
				|  |  |                 .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private String genEndpoint(Map<String, Object> params, Exchange exchange) {
 | 
	
		
			
				|  |  |         String api = params.get("api").toString();                     // API接口名称
 | 
	
		
			
				|  |  |         String param = params.get("param").toString();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         AppApi appApi = getApiInfo(api);
 | 
	
		
			
				|  |  |         ObjectMapper objectMapper = new ObjectMapper();
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             if (appApi == null) {
 | 
	
		
			
				|  |  |                 return "";
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             JsonNode jsonNode = objectMapper.readValue(param, JsonNode.class);
 | 
	
		
			
				|  |  |             String host = appApi.getMicroServiceUri().split(",")[0];
 | 
	
		
			
				|  |  |             String endPoint = "restlet:http://" + host + appApi.getMethodName() + "restletMethods=" + appApi.getMethod();
 | 
	
		
			
				|  |  |             final String[] body = {""};
 | 
	
		
			
				|  |  |             appApi.getParameters().forEach(p -> {
 | 
	
		
			
				|  |  |                 String value = jsonNode.asText(p.getName());
 | 
	
		
			
				|  |  |                 if (p.getType().equals("2")) { //path param
 | 
	
		
			
				|  |  |                     endPoint.replace("{" + p.getName() + "}", value);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                 body[0] += ("&" + p.getName() + "=" + value);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             if (body[0].length() != 0) {
 | 
	
		
			
				|  |  |                 exchange.getOut().setBody(body[0].substring(1));
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         } catch (IOException e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return "";
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private AppApi getApiInfo(String api) {
 | 
	
		
			
				|  |  |         AppApi appApi = apiMap.get(api);
 | 
	
		
			
				|  |  |         if (appApi != null) {
 | 
	
		
			
				|  |  |             return appApi;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         HTTPResponse response = HttpClientKit.get("http://localhost:10000/api/v1.0/admin/appApi/search?filters=msMethodName%3D" + api + "&size=15&page=1");
 | 
	
		
			
				|  |  |         if (response.getStatusCode() != 200) {
 | 
	
		
			
				|  |  |             return null;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             appApi = AppApi.parse(response.getBody());
 | 
	
		
			
				|  |  |             apiMap.put(api, appApi);
 | 
	
		
			
				|  |  |         } catch (IOException e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             return null;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return appApi;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |