java对外接口开发实例

  1. 使用授权码_secret,从服务代理端获取令牌。
  2. 使用令牌,对服务请求者身份标识(_orgid)、服务标识(_servicecode)和请求时间(_rtime)进行令牌密钥计算,得到令牌密钥信息_token。
  3. 将服务请求者身份标识(_orgid)、服务标识(_servicecode)、请求时间(_rtime)和令牌密钥(_token)放入HTTP请求的Header,发送请求到服务代理平台。

服务代理平台:

  1. 获取请求Header的服务请求者身份标识(_orgid)、服务标识(_servicecode)、请求时间(_rtime)和令牌密钥(_token)等信息,进行权限验证,进行调用频率、调用次数、流量检验。
  2. 验证通过后,从系统中获取被授予的输出参数,将被授予输出参数组成Json数组作为_fieldNames放入发送给提供方服务的HTTP请求Head区。

提供方服务平台:

  1. 获取请求数据进行相关业务处理。
  2. 根据HTTP请求Header区输出参数(_fieldNames)信息过滤输出参数。
  3. 返回调用结果给服务代理平台,再由服务代理平台返回给服务使用方。

 

1)设置签名规则

  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 "";
        }
    }

 

2)获取令牌信息

 @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;
    }

 

3)接口调用示例

   /**
     * 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 "返回成功";
    }

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值