搜索
简帛阁>技术文章>编程语言Java接口签名(Signature)实现方案

编程语言Java接口签名(Signature)实现方案

编程语言Java接口签名(Signature)实现方案

Java接口签名(Signature)实现方案

大家好,我是程序员田同学!

今天上午收到一个需求,针对当前的系统开发一个对外开放的接口。

既然是对外开放,那么调用者一定没有我们系统的Token,就需要对调用者进行签名验证,签名验证采用主流的验证方式,采用Signature 的方式。

一、要求

下图为具体要求

二、流程

​ 1、线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret

  2、加入timestamp(时间戳),10分钟内数据有效

  3、加入流水号noncestr(防止重复提交),至少为10位。针对查询接口,流水号只用于日志落地,便于后期日志核查。 针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。

  4、加入signature,所有数据的签名信息。

三、实现

简单来说,调用者调用接口业务参数在body中传递,header中额外增加四个参数signature、appkey、timestamp、noncestr。

我们在后台取到四个参数,其后三个参数加上调用者分配的appSecret,使用字典排序并使用MD5加密后与第一个参数signature进行比对,一致既表示调用者有权限调用。

以下代码为接口验证签名的demo实现:

   //引用jackson依赖
    @Autowired
    private ObjectMapper objectMapper;

    @Value("${appsecret}")
    private String appSecret;
  
  /**
     * 验证签名
     * @param preInfoItem
     * @return
     */
    boolean checkSignature(PreInfoItem preInfoItem) throws JsonProcessingException, IllegalAccessException {

        String signature="signature";

        String appkey="appkey";

        String timestamp="timestamp";

        String noncestr="noncestr";

        HttpServletRequest request = ServletUtils.getRequest();

        String headerSignature = request.getHeader(signature);
        String headerAppkey = request.getHeader(appkey);
        String headerTimestamp = request.getHeader(timestamp);
        String headerNoncestr = request.getHeader(noncestr);

		//因为需要排序,直接使用TreeMap
        Map parms=new TreeMap<>();
        parms.put(appkey,headerAppkey);
        parms.put(timestamp,headerTimestamp);
        parms.put(noncestr,headerNoncestr);


        Map stringObjectMap = objectToMap(parms, preInfoItem);
        String s = buildSignature(stringObjectMap);
        //签名比对
        if (s.equals(headerSignature)){
            return true;
        }
        return false;
    }

    Map objectToMap(Map map,Object o){
        Field[] declaredFields = o.getClass().getDeclaredFields();

        for (Field field : declaredFields) {
            field.setAccessible(true);

            try {
                if (field.getName() instanceof String){
                    map.put(field.getName(),field.get(o));
                }
            }catch (IllegalAccessException e){
                throw new CustomException("对象转map异常");
            }

        }
        return map;
    }

  private String buildSignature(Map maps){
      String s2;
      try {
            StringBuffer s = null;
            String s1 = objectMapper.writeValueAsString(maps);
            //添加appSecret
            s.append(s1).append(appSecret);
             s2 = DigestUtils.md5DigestAsHex(s.toString().getBytes());
        }catch (JsonProcessingException e){
            throw new CustomException("map转json异常");
        }

        return s2;
    }

好啦,赶快去试一下吧!

文章来源:https://www.cnblogs.com/tianClassmate/p/15819039.html

编程语言Java接口签名(Signature)实现方案Java接口签名(Signature)实现方案大家好,我是程序员田同学!今天上午收到一个需求,针对当前的系统开发一个对外开放的接口。既然是对外开放
家好,我是程序员田同学!今天上午收到一个需求,针对当前的系统开发一个对外开放的接口。既然是对外开放,那么调用者一定没有我们系统的Token,就需要对调用者进行签名验证,签名验证采用主流的验证方式,采
一、前言由于之前写过的一片文章(java接口签名(Signature)实现方案)收获了很多好评,此次来说一下另一种简单粗暴的签名方案。相对于之前的签名方案,对body、paramenter、path
预祝大家国庆节快乐,赶快迎接美丽而快乐的假期吧!!!前言在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。其中我认为最终要
一、前言由于之前写过的一片文章(java接口签名(Signature)实现方案)收获了很多好评,此次来说一下另一种简单粗暴的签名方案。相对于之前的签名方案,对body、paramenter、path
一段XMLsignature的demo:<Signaturexmlnshttp://wwww3org/2000/09/xmldsig><SignedInfo><!规范化的
最近在进行微信公众号开发,微信分享签名的时候,时灵时不灵。通过微信debug查看,发现不灵的时候报invalidsignature错误,在网上查了各种资料,准备进行问题的排查。(1)首先看,acces
本文是使用java语言调用微信提供的接口,获取签名的详细过程,大致步骤如下:在官网生成appId与appSecret,然后通过appId与appSecret调用接口获取到Accesstoken通过A
几乎每一个开发用于微信公众号页面的工程师都遇到过微信jssdk报的各种错误,通常是permissiondenied,类似这样:通常他们会建议你把debug选项开开,比如这样:wechatconfig(
微信分享的签名算法微信也写有,主要是调用接口需要使用服务器(微信官方文档是这么说的,试了下前端居然特么也可以),不过微信的access_token和jsapi_ticket是有使用次数限制的,所以还