package foundation.icall.connector;
|
|
import java.util.Date;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import cn.hutool.crypto.asymmetric.KeyType;
|
import cn.hutool.crypto.asymmetric.RSA;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.Filter;
|
import foundation.handler.DataPool;
|
import foundation.icall.ICall;
|
import foundation.icall.callout.ICallRequest;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.json.JObjectReader;
|
import foundation.persist.NamedSQL;
|
import foundation.persist.SQLRunner;
|
import foundation.server.config.SecretMap;
|
import foundation.util.Util;
|
import foundation.workflow.WorkStep;
|
import okhttp3.MediaType;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
|
|
public class WeaverConn extends HttpServerConn {
|
|
private static WeaverConn instance;
|
private static int TimeOutMinute = 3;
|
private static String monitorId = "WeaverConn";
|
public Date lastTime;
|
private String secrit;
|
private String spk;
|
private String secret;
|
private String token;
|
|
private WeaverConn() {
|
|
}
|
|
public static synchronized WeaverConn getInstance() {
|
if (instance == null) {
|
instance = new WeaverConn();
|
}
|
|
return instance;
|
}
|
|
public Entity systemLogin(DataPool dataPool) throws Exception {
|
JObjectReader dataReader = dataPool.getJObjectReader();
|
|
if (dataReader.isEmpty()) {
|
return null;
|
}
|
|
//1. 进行secret合法性检查
|
String systemId = dataReader.getString("systemId");
|
String secret = dataReader.getString("secret");
|
boolean systemSecretentify = SecretMap.getSecret(systemId).equalsIgnoreCase(secret);
|
|
if (!systemSecretentify) {
|
return null;
|
}
|
|
Filter filter = new Filter();
|
filter.add("md_employee.oa_account", dataReader.getString("oaAccount"));
|
filter.add("md_employee.secret", dataReader.getString("userSecret"));
|
|
Entity entity = getExistsUser(filter);
|
|
if (entity == null) {
|
return null;
|
}
|
|
String userCaption = entity.getString("employee_name");
|
|
if (Util.isEmpty(userCaption)) {
|
userCaption = entity.getString("name");
|
}
|
|
return entity;
|
}
|
|
@Override
|
public void login(WorkStep step, ICall iCall) throws Exception {
|
if (!tokenExpired()) {
|
return;
|
}
|
|
//1. 获取 SECRIT 与 SPK
|
getSecritAndSPK();
|
|
//2. 根据 SECRIT 生成 secret
|
createSecret();
|
|
//3. 获取 token
|
getToken();
|
}
|
|
@Override
|
public void logout(WorkStep step, ICall iCall) throws Exception {
|
|
}
|
|
@Override
|
public ICallRequest createRequest(String url) {
|
ICallRequest request = new ICallRequest(meta.getString("url") + url);
|
String userid = meta.getString("userid");
|
String appid = meta.getString("appid");
|
|
request.addHeader("appid", appid);
|
request.addHeader("userid", userid);
|
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. build request
|
String baseurl = meta.getString("url");
|
String registUrl = meta.getString("registUrl");
|
String appid = meta.getString("appid");
|
String cpk = meta.getString("cpk");
|
String url = baseurl + registUrl + "?appid=" + appid + "&cpk=" + cpk;
|
|
JSONObject jsonBody = new JSONObject();
|
jsonBody.put("loginId", meta.getString("loginId"));
|
jsonBody.put("userpassword", meta.getString("userPassword"));
|
|
Request request = new Request.Builder()
|
.url(url)
|
.post(RequestBody.create(MediaType.get("text/plain"),jsonBody.toJSONString()))
|
.build();
|
|
// 2. send request
|
OkHttpClient httpClient = new OkHttpClient();
|
Response response = httpClient.newCall(request).execute();
|
JSONResponse result = new JSONResponse(response);
|
|
if (response == null || result.hasErrors()) {
|
return;
|
}
|
|
secrit = result.getString("secrit");
|
spk = result.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. 创建请求
|
String appid = meta.getString("appid");
|
String tokenUrl = meta.getString("tokenUrl");
|
String url = meta.getString("url") + tokenUrl + "?appid=" + appid + "&=secret" + secret;
|
|
Request request = new Request.Builder()
|
.url(url)
|
.post(RequestBody.create(MediaType.get("text/plain"),""))
|
.build();
|
|
|
//2. 获取 response
|
OkHttpClient httpClient = new OkHttpClient();
|
Response response = httpClient.newCall(request).execute();
|
|
JSONResponse result = new JSONResponse(response);
|
|
if (response.isSuccessful()) {
|
return ;
|
}
|
|
token = result.getString("token");
|
lastTime = new Date();
|
}
|
|
private Entity getExistsUser(Filter filter) throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getUserByUsername");
|
|
filter.add("md_employee.is_active", "T");
|
filter.add("sys_user.is_active", "T");
|
namedSQL.setFilter(filter);
|
|
Entity entity = SQLRunner.getEntity(namedSQL);
|
return entity;
|
}
|
|
public String getName() {
|
return meta.getName();
|
}
|
}
|