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();
|
}
|
}
|