泛微第三方异构系统调用流程

  • Post author:
  • Post category:其他



一、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;
    }
}



版权声明:本文为superblade12原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。