接上一篇异业合作,如果一个第三方系统(我们定义为B系统)需要直接调用本系统(我们定义为A系统),那么系统间必须授权才能访问已保证系统的数据安全。
首先我们定义接口的请求示例,已http协议为例:
http://接口URL?token =xx &jsonData=xxxxx&sign=xxxx
我们可以看到需要访问A系统,我们需要携带token,调用A系统的参数而且这些参数是经过加密的,还有签名。
数据传输标准:
调用方式(url)
POST,视具体接口定义
请求类型(ContentType)
application/json
响应类型(ContentType)
application/json
首先B系统在请求A系统的数据接口之前先调用A系统的获取token接口。
/oauth2/accessToken
token需要的参数:
参数 | 参数选项 | 意义 |
grant_type | 必须 | 该值固定为access_token |
client_id | 必须 | 即对接账号(A系统和B系统约定的账号id) |
timestamp | 必须 | 当前调用时间,格式为yyyy-MM-dd HH:mm:ss 示例: “2018-01-01 01:01:01” 时差不能相差半小时以上 |
username | 必须 | 用户名(A系统和B系统约定的账号) |
password | 必须 | 用户密码(双方预定),必须是md5加密后的字符串,不要使用原文!大写 |
scope | 必须 | 申请权限。(传0,为以后扩展用) |
sign | 必须 | 签名,生成规则如下: 按照以下顺序将字符串拼接起来 client_secret+timestamp+client_id+username+password+grant_type+scope+client_secret client_secret(双方约定 需要md5加密后的转大写)、password(需要md5加密后的转大写); 将上述拼接的字符串使用MD5加密,加密后的值再转为大写 |
返回的token数据字段:
类型JSON | |
参数 | 意义 |
uid | 唯一id |
access_token | 令牌 |
refresh_token | 刷新token |
time | 当前时间 |
expires_in | access_token的过期时间,秒级别,86400秒后过期,即24小时有效期 |
refresh_token_expires | refresh_token的过期时间,毫秒级别 |
返回的token数据格式样例:
{
"result": true,
"msg": "success",
"uid": "57",
"access_token": "8BAC35711832492780DA535259949CA8",
"refresh_token": "FF69836D701C49E88EB1823AB545CEFB",
"time": 1564385329500,
"expires_in": 86400,
"refresh_token_expires": 1567063729500
}
接下来就可以通过token去请求接口了。
将需要传的参数抽象出来组装成公共参数:
/**
*
* @param inputParam
* @return
*/
public Map<String, Object> getSendParam(Map<String, Object> inputParam){
Map<String, Object> params = new LinkedHashMap<>();
//上面获取的token的逻辑
String token = getACToken();
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String input = JSONObject.toJSONString(inputParam);
log.info("本次接口发送参数:"+input);
//对参数进行加密处理
String inputDES = Des3Utils.get3DESEncryptECB(input, desKey);
byte[] decoded = Base64.getDecoder().decode(inputDES);
String inputHex = Des3Utils.byteToHexString(decoded);
String subString = subSign(input, timestamp, token);
String sign = MD5Util.getMd5(subString).toUpperCase();
//拼接参数
params.put("token", token);
params.put("sign", sign);
params.put("timestamp", timestamp);
params.put("clientId", clientId);
params.put("jsonData", inputHex);
return params;
}