一、ECOLOGY系统配置
1、配置接口白名单
在ecology系统代码目录中找到以下配置文件:ecology/WEB-INF/prop/weaver_session_filter.properties
checkurl=/api/hrm/emmanager;/api/userPhrase;
uncheckurl=/api/ec/dev/app/getCheckSystemInfo;/api/ec/dev/app/emjoin;
unchecksessionurl=/api/ec/dev/util/accesspage;.../api/loginportal/element/;/api/edc/fillin/;
在unchecksessionurl=后面添加/api/ec/dev/auth/regist;/api/ec/dev/auth/applytoken;
2、发放许可证(appid)
在ecology系统数据库执行以下脚本示例(
请不要直接使用示例中的数据
):
INSERTINTO ECOLOGY_BIZ_EC(ID,APPID,NAME) VALUES('123456','EEAA5436-7577-4BE0-8C6C-89E9D88805EA','上海泛微网络科技股份有限公司');
COMMIT;
字段描述:
-
ID:数据库主键。保证与其它系统发放的许可证在数据库中的主键标识不冲突即可(
对应示例:123456
)
-
APPID:许可证号码。最终发放给异构系统的许可证号码,多个许可证号码保证唯一(
对应示例:EEAA5436-7577-4BE0-8C6C-89E9D88805EA
)。可访问
http://www.uuid.online/
UUID在线生成器(保证唯一即可)
-
NAME:许可证名称。用于快速辨识许可证发放系统(
对应示例:上海泛微网络科技股份有限公司
)
3、清除OAsql缓存
chrome浏览器访问 OA地址/commcache/cacheMonitor.jsp界面,点击重启加载配置。这样数据库操作修改的数据可以及时生效。
4、限制许可证使用ip地址
在ecology系统代码目录中找到以下配置文件:ecology/WEB-INF/prop/weaver_rest_token.properties
复制# 限制Rest API Token Invoke注册端IP地址,多个IP地址之间用逗号分隔# 例如:allowIp=127.0.0.1,192.168.0.1,172.10.0.1,10.10.10.01allowIp=
在allowIp=后面添加客户调用方服务器实际的ip地址(
不设置将代表不限制任何ip,生产环境建议设置
)
二、异构系统编码实现认证
1、引入RSA加密算法工具jar包到异构系统
-
java开发语言的客户可以直接在ecology系统代码目录中找到
ecology/WEB-INF/lib/hutool-all-5.3.0.jar
文件引入到异构系统项目资源目录下。
c#参考:
RSAConvert.cs
python参考:
auth_token.py
-
其它开发语言的异构系统请自行查询一下底层库实现的rsa算法。
在线测试rsa算法加解密网站:
在线RSA测试
关于RSA算法请参考百度百科:
RSA算法
三、postman演示(配置完成后使用postman测试是否能通)
首先向OA系统发送许可证信息进行注册认证
演示如下
然后拿取到的secrt跟spk在RSA中进行加密
加密后的值在放入secret中获取token
四、演示代码
package com.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import weaver.rsa.security.RSA;
import java.util.HashMap;
import java.util.Map;
/**
* description :
* author :JHY
* date : 2020/6/3
* version : 1.0
*/
public class IdentityVerifyUtil {
public static final String APPID = "EEAA5436-7577-4BE0-8C6C-89E9D88805EA";
public static final String HOST = "http://127.0.0.1:8080";
//系统公钥信息
private String SPK = null;
//秘钥信息
private String SECRET = null;
private static IdentityVerifyUtil instance;
public static synchronized IdentityVerifyUtil getInstance() {
if (instance == null) {
instance = new IdentityVerifyUtil();
instance.regist();
}
return instance;
}
private IdentityVerifyUtil() {
}
private void regist() {
//httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
HttpManager http = new HttpManager();
//请求头信息封装集合
Map<String, String> heads = new HashMap<String, String>();
//获取当前异构系统RSA加密的公钥
String cpk = new RSA().getRSA_PUB();
//当前异构系统用于向ECOLOGY注册时使用的账号密码通过DES加密后密文进行传输
//kb1906及以上版本 已废弃账号密码校验
//封装参数到请求头
heads.put("appid", APPID);
heads.put("cpk", cpk);
//调用ECOLOGY系统接口进行注册
try {
String data = http.postDataSSL(HOST + "/api/ec/dev/auth/regist", new HashMap<>(), heads);
//返回的数据格式为json,具体格式参数格式请参考文末API介绍。
//注意此时如果注册成功会返回秘钥信息,请根据业务需要进行保存。
if (data != null) {
JSONObject result = JSON.parseObject(data);
if ("true".equals(result.getString("status"))) {
this.SPK = result.getString("spk");
this.SECRET = result.getString("secrit");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String getToken() {
//httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
HttpManager http = new HttpManager();
//请求头信息封装集合
Map<String, String> heads = new HashMap<String, String>();
RSA rsa = new RSA();
//对秘钥进行加密传输,防止篡改数据
String secret = rsa.encrypt(null, SECRET, null, "utf-8", SPK, false);
//封装参数到请求头
heads.put("appid", APPID);
heads.put("secret", secret);
//调用ECOLOGY系统接口进行申请
try {
String data = http.postDataSSL(HOST + "/api/ec/dev/auth/applytoken", new HashMap<>(), heads);
if (data != null) {
JSONObject res = JSON.parseObject(data);
if ("true".equals(res.getString("status"))) {
return res.getString("token");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取请求头信息
* @param token
* @param userid
* @param spk
* @return
*/
public static Map<String, String> getHttpHeads(String token,String userid,String spk){
Map<String, String> heads = new HashMap<>();
heads.put("token", token);
heads.put("appid", IdentityVerifyUtil.APPID);
RSA rsa = new RSA();
String secretUserid = rsa.encrypt(null, userid, null, "utf-8", spk, false);
heads.put("userid", secretUserid);
return heads;
}
public String getSPK() {
return SPK;
}
public String getSECRET() {
return SECRET;
}
}