API签名方案

说明

签名算法遵循RFC 2104 HMAC-SHA1规范,使用AccessSecret对编码、排序后的整个请求串计算HMAC值作为签名。签名的元素是请求自身的一些参数,由于每个API请求内容不同,所以签名的结果也不尽相同。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )

签名步骤

  1. 构建待签名字符串
    待签名字符串(StringToSign)是API请求拼装的字符串,用于计算签名,包括:

    1. 请求方法(GET | POST | PUT 等),后面添加换行符"\n"

    如:GET\n

    1. 请求API的路径,后面添加换行符"\n"

    请求api路径为请求地址根域名之后首个问号之前的部分,如:请求地址为xxx.com/common/config.do?apiAdvertData=xxxx,请求路径是/common/config.do;如果请求的是根域名部分,请求路径为/;

    1. 签名密钥ID(SignKeyId),后面添加换行符"\n"

    签名密钥由后端创建,一个ID对应一个密钥

    密钥ID同时需要放入header中的ski项
    1. 请求参数部分

    请求参数包括:

    • 地址参数,即请求url里?后边的部分
    • content-type为form-data时表单里的非文件参数
    • content-type为x-www-form-urlencoded时表单里的所有参数
      将所有参数按照ASCII码的顺序对参数名进行排序后,以参数名=参数值&参数名=参数值的格式进行拼接,如a=va&b=vb...
      ##### 请求参数包含以下关键项:
  2. timestamp: gmt+8时区毫秒级时间戳(北京时间13位时间戳),必须项
  3. appv: app版本号,如3.0.6,必须项
  4. apiv: 请求api的版本号,如1,非必须项
  5. os:请求客户端类型,用以区分安卓、ios、h5等, 必须项
  6. token:用户身份令牌,非必须项
  7. cmd5:请求content-type为 multipart/form-data时的文件md5值(32位小写);content-type为text、text/plain、application/json时的请求body字符串md5值(32位小写),非必须项
  8. 计算签名
    使用构建完成的待签名字符串,和预先分配的签名密钥,通过hmac-sha1算法生成签名,将得到的结果作base64转码
  9. 完成请求
    将生成的签名内容,追加到请求地址之后的sign参数处发起请求。
  10. 示例

    1. 原始请求

      Request URL: xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531
      Request Method: PUT
      ski: ios1907
      request payload: {"id":1,"username":"admin","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}
    2. 待签名字符串

      PUT\n
      /user\n
      ios1907\n
      a=1&appv=3.0.1&b=2&c=3&cmd5=283b33cfab85968d961c489295d58531&os=1×tamp=1562919679325
      1. 完成请求

      将以上得到的待签名字符串,使用签名密钥(假定密钥值为"qktx")进行 hmac-sha1运算(结果作base64转码处理),得到最终sign值: rOqRxnby6Eo06e8HWRgSs7m8u6I=;
      将值追加到请求地址之后的sign参数处,完成最终请求:

      Request URL: xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531&sign=rOqRxnby6Eo06e8HWRgSs7m8u6I%3D
      Request Method: PUT
      ski: ios1907
      request payload: {"id":1,"username":"admin","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}

参考资料:

你可能感兴趣的:(签名java)