zoukankan      html  css  js  c++  java
  • 项目API接口鉴权流程总结

    权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要API使用签名方法(Sign)对接口进行鉴权。每一次请求都需要在请求中包含签名信息, 以验证用户身份,不然任何人都可以调我们公司的接口,会导致安全隐患。

    思路:在接口请求参数都带上appKey,签名sign和时间戳timestamp等字段。

    假如我们是甲方时,那么需要让乙方在目标网站上申请或者给乙方提供安全凭证(appKeyappSecret),其中 appKey是用于标识 API 调用者的身份,appSecret是用于加密签名字符串和服务器端验证签名字符串的密钥。appSecret必须严格保管。避免泄露。

    乙方(对方)需要做

    根据甲方(我们)提供appSecret和需要传的特定参数生成的签名sign,最后在接口的url参数拼接上,签名sign,时间戳timestampappKey等参数。

    具体步骤如下:

    1.    对参数进行排序和拼接

    首先对请求参数按参数名做字典序升序(自然顺序)排列,然后格式化特定的形式,例如 k=v的形式,同时参数间使用"&"拼接在一起,或者kv的形式,不用"&"拼接的形式(注意不包括签名Sign参数,v为原始值而非url编码后的值)

    示例 采用k=v的形式,同时参数间使用"&"拼接在一起

    appkey=00159&from=51916&phone=13612549848&thirdOrderId=768169123&timestamp=2020-10-22 17:39:08&ver=3.4

    2.    使用特定的加密算法进行加密(Md5SHA),再进行大小写格式化等操作

    String sig = MD5Utils.EncoderByMd5(appSecret + “参数进行排序和拼接后的字符串”+ appSecret).toLowerCase().substring(0, 30);

    3.  url拼接签名sign,时间戳timestampappKey等参数

    StringBuilder stringBuilder = new StringBuilder(url);
    if (url.contains("?")) {
        stringBuilder.append("&client_id=").append(clientId)
                .append("&ext_user_id=").append(phead.getUserId())
                .append("&sign=").append(sign)
                .append("&timestamp=").append(timestamp)
                .append("&phone=").append(phone)
                .append("&callback_info=").append(phead.getUserId());
    }

    项目实战

    示例1

    示例2

     我们(甲方)要做

    拿到对方请求我们传过来的参数中的签名signappKey和时间戳等字段,然后通过appKey去获得对应的密码appSecret(这两个参数appKeyappSecret是我们定义后给乙方的),我们通过和乙方一样的方式生成签名sign2,最后比较对方传过来的sign值和我们以同样方式生成得到的sign2是不是一致,一致签名验证就通过,不一致签名就是失败;

    注意:有了签名,基本上数据的合法性就得到了保障。只要坏人没有秘钥就无法伪造调用方的请求。但坏人依然可以截取调用方的请求,不停的发送给服务端,造成服务端资源紧张、数据错误等不好的结果。为了防止同样的请求多次发送,我们往往还要求调用方提供一个唯一的序列号,比如UUID、时间戳之类的。服务端需要在收到请求的第一时间校验该唯一序列号。我们可以通过spring的切面或者拦截器来做。

    参考/好文 

    https://www.web3.xin/index/article/156.html

  • 相关阅读:
    PHP中each与list用法分析
    三大范式通俗讲解
    数据库三大范式详解
    利用JS制作简便计算器
    CSS下拉列表错误纠正
    下拉列表
    CSS选择器、标签,div的位置。
    php注册审核
    php分页查询
    php投票练习
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/13861572.html
Copyright © 2011-2022 走看看