# Rest三方互信接口(Since V8.2SP1)

# 介绍

基于接口访问安全考虑,自V8.2SP1(包含)起,将部分重要接口设置为必须通过三方互信方式才能调用。

# 说明

A6产品线不支持Rest远程调用。如需定制化开发,需要使用A8版本。

# token失效时长

不同版本可能存在差异,以v8.2sp1 20221013版本为例,时长为23分钟

# 什么时候需要用?

场景:OA升级至V8.2SP1及后续版本,原本可正常调用的rest接口出现401错误(如图)

1716276218798.png

接口配置文件:ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\base\dataSynchronizationAccessInfo.properties

## form/getformdata/{summaryIdOrAffairId}
com.seeyon.ctp.rest.resources.FormResource#getformdata#java.lang.Long=

## affairData/pending/code/{memberCode}
com.seeyon.ctp.rest.resources.AffairDataV2Resource#getPendingList#java.lang.String=

## interface for v8
com.seeyon.ctp.rest.resources.V8TicketResources#checkTicket#java.lang.String=
com.seeyon.ctp.rest.resources.V8TicketResources#getDomainIds#java.lang.String,java.lang.Long=
com.seeyon.ctp.rest.resources.V8TicketResources#getPluginInfo#java.lang.String=
com.seeyon.ctp.rest.resources.V8TicketResources#getSysVarList#java.lang.String=
com.seeyon.ctp.rest.resources.V8TicketResources#getSysByName#java.lang.String,java.lang.String,java.lang.Long=
com.seeyon.ctp.rest.resources.V8TicketResources#getMemberRoles#java.lang.String,java.lang.Long=

## discard old deprecate rest
## pending
com.seeyon.ctp.rest.resources.AffairDataResource#getPendingList#java.lang.String,java.lang.Long,java.lang.String=
## pending/code/{memberCode}
com.seeyon.ctp.rest.resources.AffairDataResource#getPendingList#java.lang.String,java.lang.String=
## pendingbyapp
com.seeyon.ctp.rest.resources.AffairDataResource#getPendingListByApp#java.lang.String,java.lang.Long,java.lang.Integer=
## pendingCountbyapp
com.seeyon.ctp.rest.resources.AffairDataResource#getPendingListCountByApp#java.lang.String,java.lang.Long,java.lang.Integer=
## donebyapp
com.seeyon.ctp.rest.resources.AffairDataResource#getDoneListByApp#java.lang.String,java.lang.Long,java.lang.Integer=
## done
com.seeyon.ctp.rest.resources.AffairDataResource#getDoneList#java.lang.String,java.lang.Long=
## done/code/{memberCode}
com.seeyon.ctp.rest.resources.AffairDataResource#getDoneListByMemberCode#java.lang.String,java.lang.String=
## sent
com.seeyon.ctp.rest.resources.AffairDataResource#getSentList#java.lang.String,java.lang.Long=
## sent/code/{meberCode}
com.seeyon.ctp.rest.resources.AffairDataResource#getSentListByMemberCode#java.lang.String,java.lang.String=
## draft
com.seeyon.ctp.rest.resources.AffairDataResource#getDraftList#java.lang.String,java.lang.Long=
## track
com.seeyon.ctp.rest.resources.AffairDataResource#getTrackList#java.lang.String,java.lang.Long=
## track/code/{memberCode}
com.seeyon.ctp.rest.resources.AffairDataResource#getTrackListByMemberCode#java.lang.String,java.lang.String=
## supervise
com.seeyon.ctp.rest.resources.AffairDataResource#getSuperviseList#java.lang.String,java.lang.Long=

# 不想用三方互信能力怎么办?

在catalina_custom.sh或者catalina_custom.bat 脚本中增加jvm参数 -DisIgnoreDataSyncAccessCheck=TRUE

# 接口交互流程

1716273254867.png

第一步:三方系统调用“http(s)://{ip}:{port}/seeyon/rest/token/channel”接口 第二步:OA系统在返回前调用配置的回调接口,将token传递给三方系统 第三步:OA系统返回channel接口处理结果,告知三方互信是否验证通过 第四步:验证通过的情况下,拿第二步的token访问OA服务rest接口

注: 三方互信是否通过根据http的code状态是否等于200判断,即使三方互信接口内存在报错,只要可正常访问到该接口,也认为是验证通过

# 开发方案

# 创建三方互信ID

1716274466792.png

  • 登录系统管理员界面,在左侧导航栏选择 “信息集成配置”,进入“三方互信访问授权”界面。
  • 新建互信ID,回调地址为三方系统提供的一个可访问地址。其他配置与“REST用户管理”中创建rest账号一致

1726306854439.png

  • 授予模块访问权限

# 配置三方互信ID

在文件“ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\base\dataSynchronizationAccessInfo.properties”中找到需要访问的接口,在“=”后配置三方互信ID,多个ID的情况下用“,”分隔,效果如图。

1716274358466.png

注: 1、更改后热生效不用重启 2、如果有多个节点,则多个节点的配置文件都要做同样的变更

# 三方系统代码开发

以springboot服务为例,细节处自行调整

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: 开放平台
 * @date: 2024-08-14
 * @description: 获取token并调用业务接口实现类
 */
@RestController()
@RequestMapping("/restTest")
public class RestTestController {

    @GetMapping("/test")
    public void test() throws Exception {
        // 获取token
        RestTemplate restTemplate = new RestTemplate();
        Map<String, Object> chanelBody = new HashMap<>();
        chanelBody.put("id", 397624945116616L); //根据实际情况调整
        chanelBody.put("secret", "a2bb6e04-f179-45dc-b051-ad45d9ae6c18"); //根据实际情况调整
        chanelBody.put("loginName", "xxx"); //根据实际情况调整,token绑定的人员,调用接口存在获取当前人员信息的场景下此字段必传,否则可以不用传

        HttpEntity<Object> tokenEntity = new HttpEntity<>(chanelBody);
        String tokenUrl = "http://192.168.225.26:30581/seeyon/rest/token/channel"; //根据实际情况调整
        restTemplate.exchange(tokenUrl, HttpMethod.POST, tokenEntity, String.class);

        //调用三方互信接口
        String channelUrl = "http://192.168.225.26:30581/seeyon/rest/form/getformdata/-4707313976826705432"; //根据实际情况调整
        HttpHeaders headers = new HttpHeaders();
        headers.set("token", RestCallbackController.token);
        HttpEntity<Object> channelEntity = new HttpEntity<>(headers);
        ResponseEntity<String> channelRespose = restTemplate.exchange(channelUrl, HttpMethod.GET, channelEntity, String.class);
        System.out.println(channelRespose.getBody());

    }
}
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @author: 开放平台
 * @date: 2024-08-14
 * @description: 三方服务提供的rest回调接口实现类
 */
@RestController
@RequestMapping("/thirdServer")
public class RestCallbackController {

    //三方互信token
    public static String token = "";

    @PostMapping("/callback")
    public void restCallback(@RequestBody Map<String, Object> data) {
        token = (String) data.get("token");
    }
}