使用授权码_secret,从服务代理端获取令牌。使用令牌,对服务请求者身份标识、服务标识和请求时间进行令牌密钥计算,得到令牌密钥信息_token。将服务请求者身份标识、服务标识、请求时间和令牌密钥放入HTTP请求的Header,发送请求到服务代理平台。
服务代理平台:
获取请求Header的服务请求者身份标识、服务标识、请求时间和令牌密钥等信息,进行权限验证,进行调用频率、调用次数、流量检验。验证通过后,从系统中获取被授予的输出参数,将被授予输出参数组成Json数组作为_fieldNames放入发送给提供方服务的HTTP请求Head区。
提供方服务平台:
获取请求数据进行相关业务处理。根据HTTP请求Header区输出参数信息过滤输出参数。返回调用结果给服务代理平台,再由服务代理平台返回给服务使用方。
设置签名规则
public String sign(String orgId, Long timestamp, String serviceCode) {
//自定义令牌信息
String platToken = '034ad87df37fff6154849852d60150717';
String result = null;
//时间戳相差超过5分钟,认定为非法操作
Long timestamp2 = System.currentTimeMillis();
if (Math.abs(timestamp2 - timestamp) > 5 * 60 * 1000) {
return '';
}
try {
Mac hmacSha256 = Mac.getInstance('HmacSHA256');
byte[] keyBytes = platToken.getBytes('UTF-8');
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, 'HmacSHA256'));
String inputString = serviceCode + orgId + timestamp;
System.out.println('INPUT: ' + inputString);
byte[] hmacSha256Bytes = hmacSha256.doFinal(inputString.getBytes('UTF-8'));
result = new String(Base64.encodeBase64(hmacSha256Bytes), 'UTF-8');
System.out.println('OUTPUT: ' + result);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return '';
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return '';
} catch (InvalidKeyException e) {
e.printStackTrace();
return '';
}
}
获取令牌信息
@RequestMapping(value = '/getPlatToken', method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public TokenResult getPlatToken(String orgId, Long timestamp, String serviceCode, String secret) {
//校验参数信息是否为空
Assert.isTrue(!StringUtils.isEmpty(orgId) && !StringUtils.isEmpty(timestamp) && !StringUtils.isEmpty(secret), '参数错误');
TokenResult result = new TokenResult();
//校验签名信息是否一致
if (secret.equals(sign(orgId, timestamp, serviceCode))) {
//校验用户标识,在本系统用户信息
SysUserPublic sysUserPublic = iSysUserDao.findOneByUserName(orgId);
if (sysUserPublic == null) {
result.setCode('0');
result.setMessage('用户标识错误');
return result;
}
//返回令牌信息
result = saveToken(orgId);
} else {
result.setCode('0');
result.setMessage('签名错误');
}
return result;
}
private TokenResult saveToken(String orgId) {
String token = UUID.randomUUID().toString();
System.out.println('orgId:' + orgId);
System.out.println('token1>>>:' + token);
// token有效期为2小时
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 7200);
Date expireTime = calendar.getTime();
// 4. 保存token
redisService.set(RedisConstant.getTokenKey(orgId+token), token, RedisConstant.EXIST_HOUSE_2);
TokenResult accessToken = new TokenResult();
accessToken.setCode('1');
accessToken.setPlatToken(token);
accessToken.setExpires(expireTime);
accessToken.setMessage('返回成功');
System.out.println('token2>>>>:' +
redisService.get(RedisConstant.getTokenKey(orgId)));
return accessToken;
}
接口调用示例
/**
* add
*/
@RequestMapping(value = '/add', method = RequestMethod.POST)
public String orderFlowGeneralSelect(HttpServletRequest request) {
String token= request.getHeader('token');
String orgId= request.getHeader('orgId');
//通过orgid获取令牌信息校验
String token1 = redisService.get(RedisConstant.getTokenKey(orgId+orgId));
if (token == null || !token1 .equals(token + '')) {
return 'token错误,请重新获取';
}
return '返回成功';
}
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点