泛微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对象私钥为nullRSA 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对象私钥为nullRSA 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);
}

效果演示:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240308-2-校招前端面试常见问题-网络及浏览器

校招前端面试常见问题【4】——网络及浏览器 1、网络相关 Q&#xff1a;请简述一下 HTTP 协议&#xff0c;以及 HTTP1.0/1.1/2.0/3.0 的区别&#xff1f; HTTP 协议&#xff1a;超文本传输协议&#xff0c;使用 TCP/IP 协议传输数据。是一个应用层的协议。 HTTP1.0&#xff…

特性螺旋面的刀具设计记录

最近和成型类刀具杠上了&#xff0c;这不最近有小伙伴提供了两个比较特殊的螺旋面工件&#xff0c;通常称作阴、阳转子。具体形状如下&#xff1a; 阴转子 阴转子端面齿形没看出有什么特殊的&#xff0c;但是在轴剖面齿形是内凹的&#xff0c;这个是比较特殊的形式。 阳转子…

信息系统项目管理师003:信息化(1信息化发展—1.1信息与信息化—1.1.3 信息化)

文章目录 1.1.3 信息化1.信息化内涵2.信息化体系3.信息化趋势 要点总结 1.1.3 信息化 信息化是一个过程&#xff0c;与工业化、现代化一样&#xff0c;是一个动态变化的过程。信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力&#xff0c;并使之造福于社会的历史…

Qt自定义控件

自定义控件 目的&#xff1a;将多个控件或者窗口作为一个整体被多次复用。 操作方式 1.首先进行自定义的ui设计&#xff0c;以及对应的.h和.cpp文件 2.到要使用的UI界面上&#xff0c;从控件库中拖拽一个Widget控件 3.右键点击"提升为" 4.填写自定义实现的类名&…

Mysql的Cardinality值

什么是Cardinality值&#xff1f; Cardinality值是Mysql做索引优化时一个非常关键的值&#xff0c;优化器会根据这个值来判断是否使用这个索引&#xff0c;它表示索引中唯一值的数目估计值&#xff0c;该值应该尽可能接近1&#xff0c;如果非常小&#xff0c;则用户需要考虑是否…

7. 交叉开发环境设置

嵌入式交叉编译工具 ​ 交叉编译工具是为了使在上位机中编译的文件能够在不同平台的目标机中执行&#xff0c;搭建交叉编译环境是嵌入式开发的第一步&#xff0c;也是关键的一步。不同的体系结构、不同的操作系统&#xff0c;甚至是不同版本的内核&#xff0c;都会用到不同的交…

win11中微软商店如何使用微信支付?microsoft store支付教程

Microsoft Store是由微软公司提供的一个数字分发平台&#xff0c;用于购买和下载Windows操作系统及其相关应用、游戏、音乐、电影、电视节目和其他数字内容。该平台最初是作为Windows 8的一部分引入的&#xff0c;后来也适用于Windows 10和其他Microsoft平台。 以下是Microsof…

JavaWeb笔记 --- 一JDBC

一、JDBC JDBC就是Java操作关系型数据库的一种API DriverManager 注册驱动可以不写 Class.forName("com.mysql.jdbc.Driver"); Connection Statement ResultSet PrepareStatement 密码输入一个SQL脚本&#xff0c;直接登录 预编译开启在url中 数据库连接池

HTML5+CSS3+JS小实例:暗紫色Tabbar

实例:暗紫色Tabbar 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scal…

【梳理】k8s使用Operator搭建Flink集群

文章目录 架构图安装cert-manager依赖helm 安装operator运行集群实例k8s上的两种模式&#xff1a;Native和Standalone两种CRDemo1&#xff1a;Application 单任务Demo2&#xff1a;Session 多任务创建ingress 总结 架构图 参考&#xff1a;部署验证demo 安装cert-manager依赖 …

CSS中 ,有哪些方式可以隐藏页面元素

文章目录 CSS中 &#xff0c;有哪些方式可以隐藏页面元素实现方式display&#xff1a;nonevisibility:hiddenopacity:0设置height 、width属性为0position:absoluteclip-path小结 CSS中 &#xff0c;有哪些方式可以隐藏页面元素 实现方式 通过 css 实现隐藏元素方法有如下 : …

uniapp列表进入动画

app列表入场动画 - DCloud 插件市场 列表入场动画https://ext.dcloud.net.cn/plugin?id16957

中医把脉笔记

目录 寸关尺对应的五脏六腑自己给自己把脉把脉五布法定寸关尺分浮中沉分快慢辨阴阳看虚实 参考文章 寸关尺对应的五脏六腑 自己给自己把脉 up主道道总是睡不着的把脉教学视频 用中指按住小骨头下面一点&#xff0c;这是关脉&#xff0c;左手的关脉对应肝脏。 把脉五布法 定…

网络基础aaa

三次握手 四次挥手 网络模型 TCP or UDP 的特点 如何理解 TCP 的5层协议 TCP的5层协议是指计算机网络体系结构中&#xff0c;与TCP&#xff08;传输控制协议&#xff09;相关的五个层次。这五个层次从高到低依次是&#xff1a;应用层、传输层、网络层、数据链路层和物理层。每…

java注释的详尽解析

一、什么是注解 (1).注解的作用 ①&#xff1a;注解一般用于对程序的说明&#xff0c;就像注释一样&#xff0c;但是区别是注释是给人看的&#xff0c;但是注解是给程序看的。 ②&#xff1a;让编译器进行编译检查的作用&#xff0c;比如下边这个Override注解是重写的意思&am…

内存安全的编程语言

美国政府新颁布《回归基础构件&#xff1a;通往安全软件之路》 《回归基础构件&#xff1a;通往安全软件之路》中&#xff0c;白宫国家网络主任办公室&#xff08;ONCD&#xff09;呼吁开发者使用「内存安全的编程语言」 内存安全的编程语言 根据NSA的建议&#xff0c;内存…

sqlyog社区版下载,数据库客户端,mysql

Downloads webyog/sqlyog-community Wiki GitHubhttps://github.com/webyog/sqlyog-community/wiki/Downloadssqlyog社区版下载

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv&#xff0c;双击LiteEnv &#xff0c;在右侧选择对应系统的env文件&#xff0c;我的是win64系统&#xff0c;所以文件名为win64.env 再双击 win64.env &#xff0c;关闭当前窗口&…

C++ Qt开发:QHostInfo主机地址查询组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能…

ROS——VirtualBox下载

下载&安装Virtualbox Oracle VM VirtualBox 根据电脑系统版本下载。 注意&#xff1a;前提是电脑cpu要开启虚拟化 根据自己的需求下载 双击开始安装 浏览可以更改下载位置&#xff0c;默认在C盘 然后一直点&#xff0c;是或下一步就好了 下载拓展包 后续需要连接使…