泛微OA服务器获取 token

泛微OA服务器获取 token

文章目录

      • 泛微OA服务器获取 token
        • 一、泛微官方方法
          • 1 ecology 系统配置
          • 2 发放/生成许可证(appid)
          • 3 限制许可证使用ip地址(该步骤也可以跳过)
          • 4 使用 postman 注册
          • 5 获取 token
          • 6 访问业务系统接口
        • 二、java 代码获取 token
        • 三、封装到 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

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系统数据库执行以下脚本示例:

INSERT INTO ECOLOGY_BIZ_EC(ID,APPID,NAME) VALUES('123456','test','上海泛微网络科技股份有限公司');
COMMIT;

字段描述:

  • ID:数据库主键。保证与其它系统发放的许可证在数据库中的主键标识不冲突即可(对应示例:123456)
  • APPID:许可证号码。最终发放给异构系统的许可证号码,多个许可证号码保证唯一(对应示例:test)
  • NAME:许可证名称。用于快速辨识许可证发放系统(对应示例:上海泛微网络科技股份有限公司)

网络上提供了随机生成字母-数字的字符串,比如:http://tool.pfan.cn/random

随机生成一个 32 位的即可,也可以为其他位数,本次演示使用随机生成的:E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60


3 限制许可证使用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.01
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 都是方法一中第一次注册后的数据,需要记录直接使用。

依赖:

<!-- 万能工具包hutool -->
  <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.7.17</version>
  </dependency>
  
  <!-- fastjson -->
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.66</version>
  </dependency>

代码:

public class TestGetToken {

    // 封装泛微获取 token 的接口
    public static void main(String[] args) {
        // 存入 token-appid-用户id加密后的scrict,返回给客户端
        Map<String, Object> apiData = new HashMap<>();
        // spk、Secret第一次注册就固定的参数,userid为测试写入
        String spk = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixdL/I2LFv9pf77Ui8/raj2RiDvh+WPcMTW0h/zGs1JkWSA19AnqopmPdUWCfTm/KTF0m1SuWjJRk4T/l4SobUzDg6ZZtKbvjGa4mpcg1i6BIM4pfpL6zqF+xgAf+Zwz/w/cL1844ITzAgQZAQoFyRB8v3luGK/uq+9swAz/QuMsHfOw8mkGeTAo00xLd4I9kN1/UsbhXuIXR34e7SnMidJAd4NXVp60WuBjjaq2Rpp/3LdE/uZdeGkWpwN6/9ZHEAukW2NisUx3OlD7s2T4XGd3MoNX0gz+AvDutCp1WrD1ltbbaXyqrvMpsPkg3XaSTD/dTo8gYhIA4NcAGfUOqQIDAQAB";
        String Secret = "de4ab3cb-1b06-4dd4-9f1b-192d158b5114";

        String userId = "10795"; // 本人OA系统中的userid,在代码中直接写入测试
        String encryptUserId  = new RSA(null, spk).encryptBase64(userId, StandardCharsets.UTF_8, KeyType.PublicKey); // RSA加密

        // 公钥加密, 所以RSA对象私钥为null
        RSA rsa = new RSA(null, spk);
        // 对秘钥进行加密传输,防止篡改数据
        String encryptSecret = rsa.encryptBase64(Secret, StandardCharsets.UTF_8, KeyType.PublicKey);
        String result = httpRequest(apiData, encryptSecret, encryptUserId);
        System.out.println(JSONUtil.parseObj(result));
    }

    /**
     * 调用ECOLOGY系统接口进行注册
     * @param apiData
     * @param encryptSecret
     * @param encryptUserId
     * @return
     */
    private static String httpRequest(Map<String, Object> apiData, String encryptSecret, String encryptUserId) {
        String uri = "/api/ec/dev/auth/applytoken"; // 获取token接口
        String appid = "E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60"; // appid 为自定义插入数据库的appid,需与数据库保持一致

        String datas = HttpRequest.post("http://192.168.190.5:8080" + uri)
                .header("appid", appid)
                .header("secret", encryptSecret)
                .header("time", "3600") // 过期时间
                .execute().body();

        Map<String, Object> dataMap = JSONUtil.parseObj(datas);
        String token = (String) dataMap.get("token");
        apiData.put("appid", appid);
        apiData.put("token", token);
        apiData.put("encryptUserId", encryptUserId);
        return JSON.toJSONString(apiData);
    }

}

代码效果:
在这里插入图片描述


三、封装到 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,访问业务系统接口。

依赖:

<!-- 万能工具包hutool -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.17</version>
</dependency>

geToken.java

@Path("/test/loginRegist")
public class getToKen extends LoginRegist {
}

LoginRegist.java

@POST
@Path("/getToken")
@Produces(MediaType.APPLICATION_JSON)
public String ecPost(Map<String, Object> params) {
    Map<String, Object> apiData = new HashMap<>();
    String spk = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixdL/I2LFv9pf77Ui8/raj2RiDvh+WPcMTW0h/zGs1JkWSA19AnqopmPdUWCfTm/KTF0m1SuWjJRk4T/l4SobUzDg6ZZtKbvjGa4mpcg1i6BIM4pfpL6zqF+xgAf+Zwz/w/cL1844ITzAgQZAQoFyRB8v3luGK/uq+9swAz/QuMsHfOw8mkGeTAo00xLd4I9kN1/UsbhXuIXR34e7SnMidJAd4NXVp60WuBjjaq2Rpp/3LdE/uZdeGkWpwN6/9ZHEAukW2NisUx3OlD7s2T4XGd3MoNX0gz+AvDutCp1WrD1ltbbaXyqrvMpsPkg3XaSTD/dTo8gYhIA4NcAGfUOqQIDAQAB";
    String appid = "E6PMNPX0A7I1T1JX5LDKPTLLD2S5KK60";
    String Secret = "de4ab3cb-1b06-4dd4-9f1b-192d158b5114";
    
    String workcode = params.get("workcode").toString(); // 员工工号
    RecordSetDataSource rs = new RecordSetDataSource();
    String encryptUserId;
    rs.execute("select id from hrmresource where workcode='" + workcode + "'");
    if (rs.next()) {
        String userId = rs.getString("id");
        encryptUserId = new RSA(null, spk).encryptBase64(userId, StandardCharsets.UTF_8, KeyType.PublicKey);
    } else if ("1".equals(workcode)) { // 超级管理员
        encryptUserId = new RSA(null, spk).encryptBase64("1", StandardCharsets.UTF_8, KeyType.PublicKey);
    } else {
        return "工号不存在";
    }
    final String uri = "/api/ec/dev/auth/applytoken";
    // 公钥加密,所以RSA对象私钥为null
    RSA rsa = new RSA(null, spk);
    //对秘钥进行加密传输,防止篡改数据
    String encryptSecret = rsa.encryptBase64(Secret, StandardCharsets.UTF_8, KeyType.PublicKey);

    //调用ECOLOGY系统接口进行注册
    String datas = HttpRequest.post("http://192.168.190.5:8080" + uri)
            .header("appid", appid)
            .header("secret", encryptSecret)
            .header("time", "3600")
            .execute().body();

    Map<String, Object> dataMap = JSONUtil.parseObj(datas);
    String token = (String) dataMap.get("token");
    apiData.put("appid", appid);
    apiData.put("token", token);
    apiData.put("encryptUserId", encryptUserId);
    return JSON.toJSONString(apiData);
}

效果演示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/441583.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Redis实战与进阶》 本专栏带你Redis从入门到入魔 这是苏泽的个…

一次生产环境上的dockerd启动失败原因分析

今夜原计划对 生产环境 上的 SDN 组件进行一次紧急扩容操作的&#xff0c;但业务基础环境中的 Docker-Engine 启动不起来了、原定计划也就无法继续进行了。 尽管查清了基础业务环境中的故障原因&#xff0c;但金主DD说今天先不干了&#xff0c;那就整理整理思路写篇流水账吧 。…

Linux环境下使用线程方式操作UART读写功能

目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数&#xff1a;usr_serial_open 2.2 关闭串口函数&#xff1a; usr_serial_close 2.3 发送数据函数&#xff1a; usr_serial_sendbytes 2.4 接收数据函数&#xff1a; thread_uart_readbytes …

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文&#xff1a;https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译&#xff1a;OneBlock 区块链领域不断发展&#xff0c;随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …

生态,带给用友新机会? | ToB产业观察

ITValue 近年来&#xff0c;不少厂商都将生态调整到战略级别&#xff0c;但做生态往往需要实打实、接地气的生态策略。 作者&#xff5c;杨丽 首发&#xff5c;钛媒体APP ITValue 3月初&#xff0c;用友召开了新一年的首场生态发布会&#xff0c;为接下来一年动作定调&#xff…

17、电源管理入门之Power supply子系统

目录 1. Power supply框架都做些什么 2. 相关数据结构和接口 2.1 数据结构 2.2 接口 3. 充电驱动 3.1 Charger Manager 3.2 Fuel Gauge 3.3 Charger IC 4. 怎样基于power supply class编写PSY driver 参考资料: 对于便携设备来说,电源管理更加的重要,因为电池电量…

数据库系统概念(第一周)

⚽前言 &#x1f3d0;四个基本概念 一、数据 定义 种类 特点 二、数据库 三、数据库管理系统&#xff08;DBMS&#xff09; 四、 数据库系统&#xff08;DBS&#xff09; &#x1f3c0;数据库系统和文件系统对比 文件系统的弊端 &#x1f94e;数据视图 数据抽象 …

jeecgboot 新建子模块 使用@EXCEL实现实现导入导出功能

一&#xff0c;用框架生成增删改查模块 二&#xff0c;在实体类entity 需要导入导出的字段上加上注解Excel 三&#xff0c;在controller类上继承jeecgboot通用controller JeecgController 并且在JeecgController里增加导出模板的方法 /*** 导出excel空模板** param req…

融资项目——网关微服务

1. 网关的路由转发功能 在前后端分离的项目中&#xff0c;网关服务可以将前端的相关请求转发到相应的后端微服务中。 2. 网关微服务的配置 首先需要创建一个网关微服务&#xff0c;并添加依赖。 <!-- 网关 --><dependency><groupId>org.springframework.cl…

相似矩阵及其对角化

目录 相似矩阵 矩阵的相似对角化 对称矩阵的相似对角化 相似矩阵 矩阵的相似对角化 对称矩阵的相似对角化

循序渐进丨MogDB 数据库新特性之SQL PATCH绑定执行计划

1 SQL PATCH 熟悉 Oracle 的DBA都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;DBA可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL …

鸿蒙实战多媒体运用:【音频组件】

音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样率为每…

macos m1 arm芯片 使用jpype报错 FileNotFoundError: [Errno 2] JVM DLL not found

startJVM(jpype.getDefaultJVMPath()) 报错 Traceback (most recent call last):File "/Users/thomas990p/PycharmProjects/tuya/volcano-biz-scripts/WenKongFa/FinalCode/java2python/CallJavaAPI.py", line 12, in <module>startJVM(jpype.getDefaultJVMPa…

寻找两个正序数组的中位数[困难]

优质博文IT-BLOG-CN 一、题目 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&…

【漏洞复现】帮管客 CRM jiliyu SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

用 Axios 提升前端异步请求的效率

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

代码随想录 -- 栈和队列

文章目录 栈实现队列描述题解 用队列实现栈描述题解 有效的括号描述题解 删除字符串中的所有相邻重复项描述题解 逆波兰表达式求值描述题解 滑动窗口最大值描述题解&#xff1a;暴力题解&#xff1a;单调队列 前 K 个高频元素描述题解 栈实现队列 题目链接 描述 使用两个栈实…

WPF开源的一款免费、开箱即用的翻译、OCR工具

前言 今天大姚给大家分享一款由WPF开源的、免费的&#xff08;MIT License&#xff09;、即开即用、即用即走的翻译、OCR工具&#xff1a;STranslate。 WPF介绍 WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、…

TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议

我要成为嵌入式高手之3月8日Linux高编第十八天&#xff01;&#xff01; __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号&#xff0c;只有当ACK为1时&#xff0c;该位才有用 …

sentinel prometheus指标收集及资源规则正则表达式实现

sentinel 支持 prometheus 收集指标 实现原理 在 sentinel-extension 模块下&#xff0c;新增 sentinel-prometheus-metric-exporter 模块。依赖Prometheus 提供的 simpleclient 和 simpleclient_httpserver 来实现 exporter。 依赖 simpleclient 主要是为了实现自定义Collect…