package foundation.icall.callout; import java.util.Date; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import foundation.action.ActionContext; import foundation.dao.bizlogic.ResponseType; import foundation.icall.ICall; import foundation.util.Util; public class WeaverSource extends HttpServerSource { private static WeaverSource instance; private static int TimeOutMinute = 3; private static String monitorId = "OAWeaverSource"; public Date lastTime; private String secrit; private String spk; private String secret; private String token; private WeaverSource() { } public static synchronized WeaverSource getInstance() { if (instance == null) { instance = new WeaverSource(); } return instance; } @Override public void login(ActionContext context, ICall iCall) throws Exception { if (!tokenExpired()) { return; } //1. 获取 SECRIT 与 SPK getSecritAndSPK(); //2. 根据 SECRIT 生成 secret createSecret(); //3. 获取 token getToken(); } @Override public void logout(ActionContext context, ICall iCall) throws Exception { } @Override public ICallRequest createRequest(String url) { ICallRequest request = new ICallRequest(meta.getString("url") + url); request.addHeader("appid", meta.getString("appid")); request.addHeader("userid", "JMXQXwgBWWfNHuoIsLJXIfkK5bEEEi7GxTJHsB8yX/ahRHATKsDZl265NvQedxHo8W8coSZQd1BRCnd69hp5UZIss17Rf0U0oGmJqKzMqKlE2gejV9R1a/NJkKiTHXjkPd2wu4U/92eHusLbokwo4sxS8Upw5uJDiYNOFk6RKwGU5O4oreKRSdxPwbBSy3c93BYZO2kNxTdnHyWvA4K+mZ/k79+qqAVVVJjpX9TIvHfMaUkO7Zb2Qs73VuC36MsB8u73cw0v93INaYuhMy5Sx2/4VsNqJ7WFGCFTYw/Z/zcp2FyzUeVSRPBYjWDwwVnhxrExfF7GXp/rg9n4IcImdA=="); request.addHeader("token", token); request.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); return request; } private boolean tokenExpired() { if (Util.isEmpty(token)) { return true; } Date now = new Date(); boolean result = now.getTime() - lastTime.getTime() >= TimeOutMinute * 60 * 1000; logger.info("是否重新获取token:{}, 上次获取token时间:{}, 本次获取token时间:{}", result, lastTime, now); return result; } private void getSecritAndSPK() throws Exception { //1. 创建请求 ICallRequest request = new ICallRequest(meta.getString("url") + "api/ec/dev/auth/regist"); request.addHeader("appid", meta.getString("appid")); request.addHeader("cpk", meta.getString("cpk")); request.addFormData("loginid", meta.getString("loginId")); request.addFormData("userpassword", meta.getString("userPassword")); //2. 获取 response JSONResponse response = post(request, ResponseType.JSON); if (response == null || response.hasErrors()) { return; } secrit = response.getString("secrit"); spk = response.getString("spk"); } private void createSecret() throws Exception { if (Util.isEmpty(spk) || Util.isEmpty(secrit)) { logger.error("weaver source can not create secret, for empty spk or secrit"); return; } RSA rsa = new RSA(null, spk); secret = rsa.encryptBase64(secrit, KeyType.PublicKey); } private void getToken() throws Exception { //1. 创建请求 ICallRequest request = new ICallRequest(meta.getString("url") + "api/ec/dev/auth/applytoken"); request.addHeader("appid", meta.getString("appid")); request.addHeader("secret", secret); //2. 获取 response JSONResponse body = post(request, ResponseType.JSON); if (body == null) { return; } token = body.getString("token"); lastTime = new Date(); } public String getName() { return meta.getName(); } }