泛微OA服务器获取 token

打印 上一主题 下一主题

主题 1026|帖子 1026|积分 3078

泛微OA服务器获取 token


  
   对于获取 token,实在泛微官方的文档提供了方法,大致步骤是:数据库插入 appid-> 注册 -> 拿到 spk 和 secret 后加密作为 secret -> spk 和用户 id 加密才是真正的 userid -> 根据加密后的 secret 和 appid 获取 token。
  整个步骤比较繁琐,此处本人演示原始泛微的方法和本人封装过后的简单方法。

一、泛微官方方法

泛微官方获取 token:https://e-cloudstore.com/doc.html
以下步骤与官方提供的方法存在重复,本次为了详细解说也重复解说。
1 ecology 系统设置

在ecology系统代码目次中找到以下设置文件:ecology/WEB-INF/prop/weaver_session_filter.properties
  1. checkurl=/api/hrm/emmanager;/api/userPhrase;
  2. uncheckurl=/api/ec/dev/app/getCheckSystemInfo;/api/ec/dev/app/emjoin;
  3. 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系统数据库执行以下脚本示例:
  1. INSERT INTO ECOLOGY_BIZ_EC(ID,APPID,NAME) VALUES('123456','test','上海泛微网络科技股份有限公司');
  2. COMMIT;
复制代码
字段形貌:


  • ID:数据库主键。包管与其它系统发放的允许证在数据库中的主键标识不辩说即可(对应示例:123456)
  • APPID:允许证号码。最终发放给异构系统的允许证号码,多个允许证号码包管唯一(对应示例:test)
  • NAME:允许证名称。用于快速辨识允许证发放系统(对应示例:上海泛微网络科技股份有限公司)
网络上提供了随机天生字母-数字的字符串,比如:http://tool.pfan.cn/random
随机天生一个 32 位的即可,也可以为其他位数,本次演示使用随机天生的:E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60

3 限定允许证使用ip地址(该步骤也可以跳过)

在ecology系统代码目次中找到以下设置文件:ecology/WEB-INF/prop/weaver_rest_token.properties
  1. // 限制Rest API Token Invoke注册端IP地址,多个IP地址之间用逗号分隔
  2. // 例如:allowIp=127.0.0.1,192.168.0.1,172.10.0.1,10.10.10.01
  3. allowIp=
复制代码
在 allowIp= 背面添加客户调用方服务器实际的ip地址(不设置将代表不限定任何ip,生产环境发起设置)

4 使用 postman 注册

注册接口:/api/ec/dev/auth/regist
在哀求头里携带 appid,获取 spk 和 secret。
注意:spk 和 secret 只必要注册一次,假如重复注册则 spk 和 secret 会进行变化,获取 token 的时候也要记得更换 spk 和 secret。

拿到 spk 和 secret 后,加密 secret:
网址:https://the-x.cn/Cryptography/Rsa.aspx


5 获取 token

获取 token 接口:/api/ec/dev/auth/applytoken
步骤 4 拿到加密后的 secret 后,把 appid 和 secret 放在哀求头内获取:



6 访问业务系统接口

步骤 5 拿到了 token,但此时只根据 token 还不能访问业务系统接口,必要详细的 userId,userId 也不是OA系统中职员的id,而是职员 id 和 spk 颠末加密处理的字符串。

此处演示获取已处理流程列表,接口地址:/api/workflow/paService/getHandledWorkflowRequestList

成功访问了接口。

二、java 代码获取 token

appid、spk、加密后的 secret 都是方法一中第一次注册后的数据,必要记录直接使用。
依靠:
  1. <!-- 万能工具包hutool -->
  2.   <dependency>
  3.       <groupId>cn.hutool</groupId>
  4.       <artifactId>hutool-all</artifactId>
  5.       <version>5.7.17</version>
  6.   </dependency>
  7.   
  8.   <!-- fastjson -->
  9.   <dependency>
  10.       <groupId>com.alibaba</groupId>
  11.       <artifactId>fastjson</artifactId>
  12.       <version>1.2.66</version>
  13.   </dependency>
复制代码
代码:
  1. public class TestGetToken {
  2.     // 封装泛微获取 token 的接口
  3.     public static void main(String[] args) {
  4.         // 存入 token-appid-用户id加密后的scrict,返回给客户端
  5.         Map<String, Object> apiData = new HashMap<>();
  6.         // spk、Secret第一次注册就固定的参数,userid为测试写入
  7.         String spk = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixdL/I2LFv9pf77Ui8/raj2RiDvh+WPcMTW0h/zGs1JkWSA19AnqopmPdUWCfTm/KTF0m1SuWjJRk4T/l4SobUzDg6ZZtKbvjGa4mpcg1i6BIM4pfpL6zqF+xgAf+Zwz/w/cL1844ITzAgQZAQoFyRB8v3luGK/uq+9swAz/QuMsHfOw8mkGeTAo00xLd4I9kN1/UsbhXuIXR34e7SnMidJAd4NXVp60WuBjjaq2Rpp/3LdE/uZdeGkWpwN6/9ZHEAukW2NisUx3OlD7s2T4XGd3MoNX0gz+AvDutCp1WrD1ltbbaXyqrvMpsPkg3XaSTD/dTo8gYhIA4NcAGfUOqQIDAQAB";
  8.         String Secret = "de4ab3cb-1b06-4dd4-9f1b-192d158b5114";
  9.         String userId = "10795"; // 本人OA系统中的userid,在代码中直接写入测试
  10.         String encryptUserId  = new RSA(null, spk).encryptBase64(userId, StandardCharsets.UTF_8, KeyType.PublicKey); // RSA加密
  11.         // 公钥加密, 所以RSA对象私钥为null
  12.         RSA rsa = new RSA(null, spk);
  13.         // 对秘钥进行加密传输,防止篡改数据
  14.         String encryptSecret = rsa.encryptBase64(Secret, StandardCharsets.UTF_8, KeyType.PublicKey);
  15.         String result = httpRequest(apiData, encryptSecret, encryptUserId);
  16.         System.out.println(JSONUtil.parseObj(result));
  17.     }
  18.     /**
  19.      * 调用ECOLOGY系统接口进行注册
  20.      * @param apiData
  21.      * @param encryptSecret
  22.      * @param encryptUserId
  23.      * @return
  24.      */
  25.     private static String httpRequest(Map<String, Object> apiData, String encryptSecret, String encryptUserId) {
  26.         String uri = "/api/ec/dev/auth/applytoken"; // 获取token接口
  27.         String appid = "E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60"; // appid 为自定义插入数据库的appid,需与数据库保持一致
  28.         String datas = HttpRequest.post("http://192.168.190.5:8080" + uri)
  29.                 .header("appid", appid)
  30.                 .header("secret", encryptSecret)
  31.                 .header("time", "3600") // 过期时间
  32.                 .execute().body();
  33.         Map<String, Object> dataMap = JSONUtil.parseObj(datas);
  34.         String token = (String) dataMap.get("token");
  35.         apiData.put("appid", appid);
  36.         apiData.put("token", token);
  37.         apiData.put("encryptUserId", encryptUserId);
  38.         return JSON.toJSONString(apiData);
  39.     }
  40. }
复制代码
代码效果:


三、封装到 OA 系统获取 token

步骤二的方法相对于泛微提供的方法,已经做了很好的简化,但假如只想使用 postman 来获取,我们可以把获取 token 封装成一个接口,打包到 OA 系统中,如许就大大简化了获取 token 的步骤。
详细需求,使用 post 方法,在哀求体内传入工号,通过工号获取 userid 获取 token,代码如下:
获取 token 步骤:


  • 1、数据库插入 appid
  • 2、ecology/WEB-INF/prop/weaver_session_filter.properties 设置token接口
  • 3、/api/ec/dev/auth/regist 哀求头携带 appid 注册(返回secret、spk)
  • 4、/api/ec/dev/auth/applytoken 哀求头携带 appid、加密后的 secret 获取 token
  • 5、拿到 token,spk 和 userid 加密后返回 userid,访问业务系统接口。
依靠:
  1. <!-- 万能工具包hutool -->
  2. <dependency>
  3.     <groupId>cn.hutool</groupId>
  4.     <artifactId>hutool-all</artifactId>
  5.     <version>5.7.17</version>
  6. </dependency>
复制代码
GetToKenByWorkCode .java
  1. @Path("/test/testGetToken")
  2. public class getToKenByWorkCode extends GetToKenByWorkCode {
  3. }
复制代码
LoginRegist.java
  1. public class GetToKenByWorkCode {
  2.     private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
  3.     @POST
  4.     @Path("/getToKenByWorkCode")
  5.     @Produces(MediaType.APPLICATION_JSON)
  6.     public String ecPost(Map<String, Object> params) {
  7.         Map<String, Object> apiData = new HashMap<>();
  8.         String spk = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixdL/I2LFv9pf77Ui8/raj2RiDvh+WPcMTW0h/zGs1JkWSA19AnqopmPdUWCfTm/KTF0m1SuWjJRk4T/l4SobUzDg6ZZtKbvjGa4mpcg1i6BIM4pfpL6zqF+xgAf+Zwz/w/cL1844ITzAgQZAQoFyRB8v3luGK/uq+9swAz/QuMsHfOw8mkGeTAo00xLd4I9kN1/UsbhXuIXR34e7SnMidJAd4NXVp60WuBjjaq2Rpp/3LdE/uZdeGkWpwN6/9ZHEAukW2NisUx3OlD7s2T4XGd3MoNX0gz+AvDutCp1WrD1ltbbaXyqrvMpsPkg3XaSTD/dTo8gYhIA4NcAGfUOqQIDAQAB";
  9.         String appid = "E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60";
  10.         String Secret = "de4ab3cb-1b06-4dd4-9f1b-192d158b5114";
  11.         String workcode = params.get("workcode").toString();
  12.         RecordSetDataSource rs = new RecordSetDataSource();
  13.         String encryptUserId;
  14.         rs.execute("select id from hrmresource where workcode='" + workcode + "'");
  15.         if (rs.next()) {
  16.             String userId = rs.getString("id");
  17.             encryptUserId = new RSA(null, spk).encryptBase64(userId, StandardCharsets.UTF_8, KeyType.PublicKey);
  18.         } else if ("1".equals(workcode)) {
  19.             encryptUserId = new RSA(null, spk).encryptBase64("1", StandardCharsets.UTF_8, KeyType.PublicKey);
  20.         } else {
  21.             return "工号不存在";
  22.         }
  23.         final String uri = "/api/ec/dev/auth/applytoken";
  24.         // 公钥加密,所以RSA对象私钥为null
  25.         RSA rsa = new RSA(null, spk);
  26.         //对秘钥进行加密传输,防止篡改数据
  27.         String encryptSecret = rsa.encryptBase64(Secret, StandardCharsets.UTF_8, KeyType.PublicKey);
  28.         //调用ECOLOGY系统接口进行注册
  29.         String datas = HttpRequest.post("http://192.168.190.5:8080" + uri)
  30.                 .header("appid", appid)
  31.                 .header("secret", encryptSecret)
  32.                 .header("time", "3600")
  33.                 .execute().body();
  34.         Map<String, Object> dataMap = JSONUtil.parseObj(datas);
  35.         String token = (String) dataMap.get("token");
  36.         apiData.put("appid", appid);
  37.         apiData.put("token", token);
  38.         apiData.put("encryptUserId", encryptUserId);
  39.         return JSON.toJSONString(apiData);
  40.     }
  41. }
复制代码
效果演示:

注意:记得把 /api/test/testGetToken/getToKenByWorkCode 这个接口设置在白名单中,白名单元置:ecology/WEB-INF/prop/weaver_session_filter.properties

假如必要使用 idea 打断点调试代码,可以在 /home/comen/weaver/Resin4/conf/resin.properties 中设置调试的端口:

然后在 idea 中设置,就可以调试指定服务器 ip 的代码:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表