package com.welab.automation.framework.utils.api; import com.welab.automation.framework.GlobalVar; import com.welab.automation.framework.utils.entity.api.SignatureUtil; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONObject; import javax.crypto.Cipher; import javax.crypto.spec.OAEPParameterSpec; import javax.crypto.spec.PSource; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.MGF1ParameterSpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.Date; import java.util.HashMap; import java.util.UUID; public class CallFicoUtils { HashMapmap = new HashMap<>(); public static void main(String[] args) { CallFicoUtils callFicoUtils = new CallFicoUtils(); // callFicoUtils.callFico(); String user="qatest102"; String password="Aa123456"; String token = callFicoUtils.getToken(user, password); System.out.println("token: " + token); } public String getToken(String user, String password){ getPublicKey(); getOffSet(); return getAccessToken(user, password); } public void callFico(){ //CLIENT_ID,CLIENT_SECRET Stage和SIT不一样 GlobalVar.GLOBAL_VARIABLES.put("CLIENT_ID","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM"); GlobalVar.GLOBAL_VARIABLES.put("CLIENT_SECRET","fA52Bm6NkSGGPFPp"); GlobalVar.GLOBAL_VARIABLES.put("host","https://mapi.sta-wlab.com"); SignatureUtil signatureUtil = new SignatureUtil("qatest106","Aa123456"); signatureUtil.getPublicKeyReq(); int offset = signatureUtil.getOffset(); signatureUtil.createSignReq(offset); } public HttpGet setHeaderForPublicKey(HttpGet request){ request.setHeader("Authorization","Bearer jQU2z9GpqqlwzuOzP7Y2sQN5rTofqM1j6q7Z2sFTuFGGDbz8npihbc"); request.setHeader("Threat-Metrix-Session-Id","mock"); request.setHeader("idx-version","3.2"); request.setHeader("accept-language","en-US"); request.setHeader("Accept-Encoding","gzip,deflate,br"); request.setHeader("Client-Id","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM"); request.setHeader("Client-Secret","fA52Bm6NkSGGPFPp"); request.setHeader("Accept","*/*"); request.setHeader("Content-Type","application/json;charset=utf-8"); return request; } public static String createCipherEx(String publicKey, int offset,String TEST_ACCOUNT,String TEST_PASSWORD) { try { String publicKeyPEM = publicKey .replace("-----BEGIN PUBLIC KEY-----", "") .replaceAll(System.lineSeparator(), "") .replace("-----END PUBLIC KEY-----", ""); GlobalVar.GLOBAL_VARIABLES.put("publicKeyPEM", publicKeyPEM); byte[] pbks = Base64.getMimeDecoder().decode(publicKeyPEM); X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(pbks); PublicKey newPbk = KeyFactory.getInstance("RSA").generatePublic(encodedKeySpec); OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT); Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding"); cipher.init(Cipher.ENCRYPT_MODE, newPbk, oaepParameterSpec); com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject(); jsonObject.put("username", TEST_ACCOUNT); jsonObject.put("authType", "PASSWORD"); jsonObject.put("authValue", TEST_PASSWORD); int timestamp = Math.round(System.currentTimeMillis() / 1000); jsonObject.put("timestamp", offset + timestamp); System.out.println("timestamp is" + String.valueOf(timestamp)); jsonObject.put("salt", UUID.randomUUID().toString()); System.out.println("jsonObject is " + jsonObject.toJSONString()); byte[] bytes = cipher.doFinal(jsonObject.toString().getBytes()); System.out.println("Result: " + Base64.getEncoder().encodeToString(bytes)); return Base64.getEncoder().encodeToString(bytes); } catch (Exception ex) { System.out.println("system error from createCipherEx"); } return ""; } public String getPublicKey(){ String publicKey=""; CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpGet request = new HttpGet("https://mapi.sta-wlab.com/v1/internal/public-key"); request = setHeaderForPublicKey(request); CloseableHttpResponse response = httpClient.execute(request); try { HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity); int statusCode = response.getStatusLine().getStatusCode(); System.out.println("Response Status Code: " + statusCode); System.out.println("responseBody: " + responseBody); JSONObject jsonObject = new JSONObject(responseBody); publicKey = jsonObject.getJSONObject("data").getString("publicKey"); String version = jsonObject.getJSONObject("data").getString("version"); System.out.println("publicKey: " + publicKey); map.put("version",version); map.put("publicKey",publicKey); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (Exception e) { e.printStackTrace(); } } return publicKey; } public String getOffSet(){ System.out.println("Start Get OffSet!!!!!!!!"); String timeString = String.valueOf(new Date().getTime() / 1000); String url="https://mapi.sta-wlab.com/v1/clock-skew?time="+timeString; System.out.println(url); String offSet=""; CloseableHttpClient httpClient = HttpClients.createDefault(); try { //"https://mapi.sta-wlab.com/v1/clock-skew?time=1741942656" HttpGet request = new HttpGet(url); request = setHeaderForPublicKey(request); CloseableHttpResponse response = httpClient.execute(request); try { HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity); int statusCode = response.getStatusLine().getStatusCode(); System.out.println("Response Status Code: " + statusCode); System.out.println("responseBody: " + responseBody); JSONObject jsonObject = new JSONObject(responseBody); offSet += jsonObject.getJSONObject("data").getInt("offset"); System.out.println("offSet: " + offSet); map.put("offSet",offSet); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (Exception e) { e.printStackTrace(); } } return offSet; } //添加请求头 public HttpPost setHeaderForAccessToken(HttpPost request){ request.setHeader("Authorization","Bearer jQU2z9GpqqlwzuOzP7Y2sQN5rTofqM1j6q7Z2sFTuFGGDbz8npihbc"); request.setHeader("Threat-Metrix-Session-Id","mock"); request.setHeader("idx-version","3.2"); request.setHeader("accept-language","en-US"); request.setHeader("Accept-Encoding","gzip,deflate,br"); request.setHeader("Client-Id","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM"); request.setHeader("Client-Secret","fA52Bm6NkSGGPFPp"); request.setHeader("Accept","*/*"); request.setHeader("Content-Type","application/json;charset=utf-8"); return request; } public String getAccessToken(String user, String password){ int offset = Integer.parseInt(map.get("offSet")); String credentials =createCipherEx(map.get("publicKey"), offset,user,password); String v = "credentials="+credentials+"&authValue=PASSWORD&version="+map.get("version"); System.out.println("credentials: "+credentials); String json = "{\n" + " \"credentials\": \""+credentials+"\"," + " \"authValue\": \"PASSWORD\"," + " \"version\": \""+map.get("version")+"\"" + "}"; System.out.println("json: " + json); String accessToken=""; CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpPost request = new HttpPost("https://mapi.sta-wlab.com/v1/oauth/token?authType=PASSWORD"); //添加Body request.setEntity(new StringEntity(json)); request = setHeaderForAccessToken(request); CloseableHttpResponse response = httpClient.execute(request); try { HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity); int statusCode = response.getStatusLine().getStatusCode(); System.out.println("Response Status Code: " + statusCode); System.out.println("responseBody: " + responseBody); JSONObject jsonObject = new JSONObject(responseBody); accessToken = jsonObject.getJSONObject("data").getString("accessToken"); System.out.println("accessToken: " + accessToken); map.put("accessToken",accessToken); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (Exception e) { e.printStackTrace(); } } return accessToken; } public static void getToken(){ try { String custiomerId="1350151013742682112"; String cmds = String.format("curl -X GET \"https://api-sta2.sta-wlab.net/onboarding-pro/jwt/"+custiomerId+"\" -H \"accept: */*\" -H \"Accept-Language: en-US\""); // 执行CMD命令 System.out.println("Executing python script file now."); Process pcs = Runtime.getRuntime().exec(cmds); pcs.waitFor(); // System.out.println(pcs.waitFor()); // 定义Python脚本的返回值 String result = null; // 获取CMD的返回流 BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());// 字符流转换字节流 BufferedReader br = new BufferedReader(new InputStreamReader(in));// 这里也可以输出文本日志 String lineStr = null; while ((lineStr = br.readLine()) != null) { System.out.println(lineStr); result = lineStr;//Python 代码中print的数据就是返回值 } // 关闭输入流 br.close(); in.close(); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }