1.ICC环境一般是部署在现场客户服务器上,由区域同事安装部署
2.ICC平台地址是https://平台ip:端口默认443,用户密码由区域同事提供,访问凭证可由区域同事/客户(知晓超级管理员用户/密码的人员)申请
3.客户无ICC环境需提前对接,可使用我方提供的第三方联调环境,联调环境信息可通过点击icc开放平台右下角在线客服->右侧常见问题:ICC联调环境(线上测试环境)信息下载获取,我方联调环境已提前申请访问凭证,无需申请访问凭证
1.使用 [system] 用户 登录ICC管理控制台
2.点击右上角 OpenAPI 按钮
3.点击最下面 申请访问凭证 按钮
4.自己填写clientId,生成 clientSecret凭证
clientId:凭证id,自定义,建议有业务标识,格式:数字、字母,长度不超过128;
clientSecret:凭证密钥,点击下图“申请凭证”按钮生成,再点击“复制”按钮,存入程序中;一个clientId多次申请,clientSecret不变
申请时报“自定义异常”时刷新平台首页或重新登录ICC平台,再次点击“OpenAPI”申请
2.1 搜索角色管理
2.2 进入角色管理,添加角色
部门权限配置
组织权限与资源权限
2.3 点击保存,角色创建成功
3.1 搜索用户管理
3.2 进入用户管理,添加用户
3.3 添加用户
使用ICC Java SDK,需要按照上述步骤完成访问凭证及openAPI用户相关操作。
ICC Java SDK支持JDK 1.8+
这里以java-sdk-oauth 1.0.13.10 版本为例
<dependency>
<groupId>com.dahuatech.icc</groupId>
<artifactId>java-sdk-oauth</artifactId>
<version>1.0.13.10</version>
</dependency>
以下这个代码示例向您展示了调用 ICC SDK for Java 的3个主要步骤:
OauthConfigUserPwdInfo
实例并初始化。这里强调,使用SDK调用接口,无需关心token有效时间,保活等
import com.dahuatech.hutool.http.Method;
import com.dahuatech.icc.config.OauthConfigUtil;
import com.dahuatech.icc.exception.ClientException;
import com.dahuatech.icc.oauth.model.v202010.GeneralResponse;
import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo;
import com.dahuatech.icc.oauth.utils.HttpUtils;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* HTTP POST请求示例
*/
public void testHTTPPost() throws ClientException {
String host = "平台IP";
String clientId = "凭证id";
String clientSecret = "凭证密钥";
String userName = "平台用户名";
String password = "平台用户密码";
boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
String port = "443";//默认是443
OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
oauthConfig.getHttpConfigInfo().setReadTimeout(-1l);//设置读取超时时间,单位毫秒,默认-1
oauthConfig.getHttpConfigInfo().setConnectionTimeout(-1l);//设置连接超时,单位毫秒,默认-1
//设置请求体
Map body = new HashMap<>();
body.put("key", "value");
//设置请求头
Map header = new HashMap<>();
header.put("key", "value");
//执行请求
GeneralResponse response = HttpUtils.executeJson("/evo-apigw/evo-xxx/pathxxx", body, header, Method.POST, oauthConfig, GeneralResponse.class);
}
/**
* 发送HTTP 上传文件示例
*/
public void testHTTPPostFormData() throws ClientException {
String host = "平台IP";
String clientId = "凭证id";
String clientSecret = "凭证密钥";
String userName = "平台用户名";
String password = "平台用户密码";
boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
String port = "443";//默认是443
OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
//设置请求体
Map body = new HashMap<>();
String filePath = "文件路径";
//请求参数为文件
File file = new File(filePath);
body.put("file",file);
//设置请求头
Map header = new HashMap<>();
header.put("key","value");
//执行请求
GeneralResponse response = HttpUtils.executeForm("/evo-apigw/evo-xxx/pathxxx", body, header, Method.POST , oauthConfig, GeneralResponse.class);
}
/**
* 发送HTTP GET请求示例
*/
public void testHTTPGET() throws ClientException {
String host = "平台IP";
String clientId = "凭证id";
String clientSecret = "凭证密钥";
String userName = "平台用户名";
String password = "平台用户密码";
boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
String port = "443";//默认是443
OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
//执行请求
GeneralResponse response = HttpUtils.executeForm("/evo-apigw/evo-brm/1.0.0/person/subsystem/get-by-paper-number?paperNumber=112233445566", null,null, Method.GET, oauthConfig,GeneralResponse.class);
}
/**
* 获取鉴权token
*/
public void testGetToken() throws ClientException {
String host = "平台IP";
String clientId = "凭证id";
String clientSecret = "凭证密钥";
String userName = "平台用户名";
String password = "平台用户密码";
boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
String port = "443";//默认是443
OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
HttpUtils.getToken(oauthConfig).getAccess_token();
}
如果使用上述SDK的方式调用ICC接口,可以不用关注此章节
鉴权接口的access_token有效期2h,权限与鉴权用户的组织、部门权限保持一致
例如:
ICC平台ip是:10.80.3.101
则接口完整地址:https://10.80.3.101:443/evo-apigw/evo-oauth/1.0.0/oauth/public-key
GET /evo-apigw/evo-oauth/1.0.0/oauth/public-key HTTP/1.1
Host: 10.80.3.101
以下是java RSA加密示例,其他语言参考RSA加密demo
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
public class RSAUtil {
/**
* 基于原生RSA公钥加密
* @param password 用户密码
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static String encrypt(String password, String publicKey) throws Exception {
//base64编码的公钥
byte[] decoded = java.util.Base64.getDecoder().decode(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr;
byte[] inputArray = password.getBytes("UTF-8");
int inputLength = inputArray.length;
// 最大加密字节数,超出最大字节数需要分组加密
int MAX_ENCRYPT_BLOCK = 117;
// 标识
int offSet = 0;
byte[] resultBytes = {};
byte[] cache = {};
while (inputLength - offSet > 0) {
if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);
offSet += MAX_ENCRYPT_BLOCK;
} else {
cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);
offSet = inputLength;
}
resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);
System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);
}
outStr = java.util.Base64.getEncoder().encodeToString(resultBytes);
return outStr;
}
}
访问凭证client_id与client_secret必须和在ICC平台上申请的client_id与client_secret保持一致,详见申请访问凭证
access_token有效期2h
例如:
ICC平台ip是:10.80.3.101
则接口完整地址:https://10.80.3.101:443/evo-apigw/evo-oauth/1.0.0/oauth/extend/token
POST /evo-apigw/evo-oauth/1.0.0/oauth/extend/token HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: 10.80.3.101:443
{
"grant_type":"password",
"username":"用户账号",
"password":"RSA加密后的密码",
"client_id":"申请的clientId",
"client_secret":"申请的clientSecret",
"public_key":"获取的公钥"
}
---------------------------------------------------------------------
{
"success": true,
"data": {
"access_token": "10000:5cb47cd80-35d9-406d-a8d3-d87dd672d5d3",
"token_type": "bearer",
"refresh_token": "b83403e1-5ea1-41fd-81fc-e86fe5252c93",
"expires_in": 86399,
"scope": "*",
"userId": "10000",
"magicId": "1868a7db-adeb-42de-8064-43b3706ae407"
},
"code": "0",
"errMsg": ""
}
调业务接口、保活与刷新token接口均需设置鉴权码
头部参数 | 解释 |
---|---|
Authorization | 格式:token_type + 空格 + access_token, token_type一般为固定值bearer 示例:bearer 1:bb951116-d963-4528-80e1-91c2e94c3e75 |