泛微OA服务器获取 token

news2024/11/17 10:00:25

泛微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);
}

效果演示:

在这里插入图片描述

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

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

相关文章

【随笔记】小程序轮播图,一屏显示三个swiper-item

常见的轮播是一屏显示一个swiper-item,有的时候需要一屏显示三个swiper-item,左右两边都显示出一点 【目前小程序基础库2.12.3 效果正常,3.几的效果会有点不正常】 效果图 wxml <!-- 轮播begin --> <swiper wx:if="{{up_down}}" class="card-swipe…

GO: 快速升级Go版本

由于底层依赖升级了&#xff0c;那我们也要跟着升&#xff0c;go老版本已经不足满足需求了&#xff0c;必须要将版本升级到1.22.0以上 查看当前Go版本 命令查看go版本 go version[rootlocalhost local]# go version go version go1.21.4 linux/amd64 [rootlocalhost local]# …

3/7作业

信号同步 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h> sem_t…

Windows系统安装Jupyter Notebook并实现公网访问内网笔记服务

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

java操作内存,简单讲解varhandle的使用

概述&#xff1a;按理说jdk8的unsafe类就够用了&#xff0c;估计是因为不安全的原因&#xff0c;到jdk9出了个varhandle类&#xff0c;到jdk21的时候出了Arena和MemorySegment,基本就可以取代unsafe类的使用了。这里我主要讲varhandle类&#xff0c;因为大部分人升级jdk顶多升到…

Excel小技巧-筛选带删除线的数据并删除

Excel小技巧-筛选带删除线的数据并删除 1、替换删除线2、筛选空行并删除 今天同事使用 Excel 的时候遇到一个需求&#xff0c;有些内容不在需要时会被标记删除线&#xff0c;后面再删除&#xff0c;但是由于数据比较多&#xff0c;不方便一个个删除&#xff0c;有没有什么办法能…

STM32 通过Modbus协议更改内部Flash(模仿EEPROM)的运行参数

main.c测试 uint8_t uart1RxBuf[64]{0};uint8_t Adc1ConvEnd0; uint8_t Adc2ConvEnd0;int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initial…

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章&#xff1a; WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么&#xff1f;为什么用它建站&#xff1f;怎么安装与部署&#xff1f; 初次安装WordPress后如何进行网站设置&#xff08;主题安装、…

阿里云k8s环境下,因slb限额导致的发布事故

一、背景 阿里云k8s容器&#xff0c;在发布java应用程序的时候&#xff0c;客户端访问出现500错误。 后端服务是健康且可用的&#xff0c;网关层大量500错误请求&#xff0c;slb没有流入和流出流量。 经过回滚&#xff0c;仍未能解决错误。可谓是一次血的教训&#xff0c;特…

数组与指针之二——二级指针之一

定义是这样&#xff1a; 多级指针&#xff08;二级指针&#xff09;&#xff0c;C语言多级指针的用法详解 (biancheng.net) 这是针对变量&#xff0c;且是一级一级的取的。但是我们经常要面对数组&#xff0c;用到二级指针。如前面第一篇所述&#xff0c;对一维数组名取地址&…

折扣价和折扣实时转换

背景 : react 项目 问题 : 在折扣数中输入折扣2.333333&#xff0c;中间会多很多0&#xff0c;输入2.222&#xff0c;不能正常输入到第三位 如下图 原因 : oFixed()数字转字符串时可能会导致精度问题 解决思路 : parseFloat来解析浮点数原代码 const calculateDiscountVal (p…

学习Java的第四天

目录 一、if选择结构 1、基本if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 2、if-else 选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 3、多重if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a…

如何让JMeter也生成精美详细allure测试报告

&#xff08;全文约2000字&#xff0c;阅读约需5分钟&#xff0c;首发于公众号&#xff1a;测试开发研习社&#xff0c;欢迎关注&#xff09; 内容目录&#xff1a; 一、需求 二、思路 三、验证 四、实现 五、优化 六、彩蛋 篇幅较长&#xff0c;建议先收藏后阅读 一、需…

Java项目:42 ssm的高校专业信息管理系统设计与实现001

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务 管理员查看学生报名专业&#xff0c;管理专业&#xff0c;课程以及学生&#xff0c;查看学生提问并回答问题&#x…

飞驰云联CEO朱旭光荣获“科技领军人才”称号

2024年2月29日&#xff0c;苏州工业园区“优化营商环境暨作风效能建设大会”成功举办&#xff0c;会上公布了2023年度苏州工业园区第十七届第一批金鸡湖科技领军人才名单&#xff0c;Ftrans飞驰云联创始人兼CEO朱旭光先生凭借在数据安全以及文件交换领域取得的突出成果&#xf…

浅谈高并发的一些解决思路

前言 《中国互联网发展状况统计报告》指出&#xff0c;截至2020年6月&#xff0c;我国网民规模已经达到9.40亿&#xff0c;较2020年3月年增长3625万&#xff0c;除了如此庞大的用户基数&#xff0c;如今人们接入互联网的方式也越来越多样&#xff0c;小到智能手表&#xff0c;…

MySQL存储函数

存储函数是有返回值存储过程&#xff0c;存储函数的参数只能还是IN类型的 1、语法 create function 存储函数名称 &#xff08;[参数列表]&#xff09;Returns type [characterrastic...]Begin--SQL语句Return ..;End;characterrastic说明&#xff1a;Deterministic:相同的输…

纯css实现太极八卦图

感觉最近好像闯鬼了&#xff0c;赶紧写个八卦图避避邪&#xff0c;开玩笑了&#xff0c;不废话&#xff0c;上菜&#xff0c;看效果上代码。 效果 代码&#xff0c;你们都是大佬&#xff0c;这里就不解释代码了 &#xff08;hover会转动喔&#xff09;。 <!DOCTYPE html&g…

Linux:kubernetes(k8s)探针LivenessProbe的使用(9)

他做的事情就是当我检测的一个东西他不在规定的时间内存在的话&#xff0c;我就让他重启&#xff0c;这个检测的目标可以是文件或者端口等 我这个是在上一章的基础之上继续操作&#xff0c;我会保留startupProbe探针让后看一下他俩的执行优先的一个效果 Linux&#xff1a;kuber…