首页 > 作文

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

更新时间:2023-04-04 16:45:08 阅读: 评论:0

目录
一、要求二、流程三、实现

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

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

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

一、要求

下图为具体要求

二、流程

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

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

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

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

三、实现

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

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

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

 //引用jackson依赖    @autowired    private objectmapper objectmapper;    @value("${appcret}")    private s2021年高考作文tring appcret;    /**     * 验证签名     * @param preinfoitem     * @return     */    boolean checksignature(preinfoitem preinfoitem) throws jsonprocessingexception, illegalaccesxception {        stringanecdotes signature="signature";        string appkey="appkey";        string timestamp="timestamp";        string noncestr="noncestr";        httprvletrequest request = rvletutils.getrequest();        string headersignature = request.getheader(signature);        string headerappkey = request.getheader(appkey);        string headertimestamp = request.getheader(timestamp);        string headernoncestr = request.getheader(noncestr);//因为需要排序,直接使用treemap        map<string,object> parms=new treemap<>();        parms.put(appkey,headerappkey);        parms.put(timestamp,headertimestamp);        parms.put(noncestr,headernoncestr);        map<string, object> stringobjectmap = objecttomap(parms, preinfoitem);        string s = buildsignature(stringobjectmap);        //签名比对        if (s.equals(headersignature)){            return true;        }        return fal;    }    map<string,object> objecttomap(map<string,object> map,object o){  人事工作流程      field[] declaredfields = o.getclass().getdeclaredfields();        for (field field : declaredfields) {            field.taccessible英语动词词组(true);            try {                if (field.getname() instanceof string){                    map.put(field.getname(),field.get(o));                }            }catch (illegalaccesxception e){                throw new customexception("对象转map异常");            }        }        return map;    }  private string buildsignature(map<string,object> maps){      string s2;      try {            stringbuffer s = null;            string s1 = objectmapper.writevalueasstring(maps);            //添加appcret            s.append硬笔书法作品(s1).append(appcret);             s2 = digestutils.md5digestashex(s.tostring().getbytes());        }catch (jsonprocessingexception e){            throw new customexception("map转json异常");        }        return s2;    }

到此这篇关于java接口签名(signature)实现方案 的文章就介绍到这了,更多相关java接口签名内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 16:45:06,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/50a6ef01fff7668741552e9ceab493fa.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:详解Java接口签名(Signature)实现方案.doc

本文 PDF 下载地址:详解Java接口签名(Signature)实现方案.pdf

标签:接口   参数   调用者   分配
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图