当前位置: 首页 > 后端技术 > Java

API签名方案

时间:2023-04-01 23:24:57 Java

表示签名算法遵循RFC2104HMAC-SHA1规范,使用AccessSecret对整个编码排序后的请求字符串计算HMAC值作为签名。签名的元素是请求本身的一些参数。由于每个API请求的内容不同,签名的结果也不同。Signature=Base64(HMAC-SHA1(AccessSecret,UTF-8-Encoding-Of(StringToSign)))签名步骤构建待签名字符串待签名字符串(StringToSign)是API请求组装的字符串,用于计算签名,包括:请求方法(GET|POST|PUT等),后接换行符“\n”例如:GET\n请求API的路径,后接换行符“\n”的请求的api路径为请求地址根域名后第一个问号前面的部分,如:请求地址为xxx.com/common/config.do?apiAdvertData=xxxx,请求路径为/common/config。做;如果请求是根域名部分,则请求路径为/;signaturekeyID(SignKeyId),后接一个换行符“\n”signaturekey由后端创建,一个ID对应一个keykeyID,需要放在header中的滑雪项中。请求参数部分请求参数包括:地址参数,即request当url后的部分content-type为form-data时,form中非文件参数的content-type为x-www-form-urlencoded,并且表格中的所有参数按照ASCII码的顺序对所有参数进行排序。最后按照参数名=参数值&参数名=参数值的格式进行拼接,比如a=va&b=vb...#####请求参数包括以下关键项:timestamp:毫秒级时间戳gmt+8时区(北京时间13位时间戳),必填项appv:app版本号,如3.0.6,必填项apiv:请求API版本号,如1,非必填项os:请求客户端type,用于区分Android、ios、h5等。必填项token:用户身份token,可选项cmd5:当请求的content-type为multipart/form-data(32位小写)时文件的md5值;content-type为text,text/plain,请求体字符串md5值(32位小写)为application/json,非必需项计算签名使用构造好的待签名字符串和预分配的签名密钥通过hmac-sha1算法生成签名,将得到的结果进行base64转码,将请求生成的签名内容附加到请求地址后的sign参数中,发起请求。示例原始请求请求URL:xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531请求方法:PUTski:ios1907request"payload:{"id":","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}PUT\n/user\nios1907\na=1&appv=3.0.1&b=2&c=3&cmd5=283b33cfab85968d961c489295d58531&os=1×tamp=1562919679325完成请求使用签名密钥(假设密钥值为“qktx”)对上述待签名字符串(假设密钥值为“qktx”)进行hmac-sha1操作base64转码处理)得到最终的符号值:rOqRxnby6Eo06e8HWRgSs7m8u6I=;在请求地址后面的sign参数上追加值,完成最终请求:请求URL:xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531&sign=rOqRxnby6DRO06e3mHWRgmethodMethod:ios1907requestpayload:{"id":1,"username":"admin","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}参考:阿里云RESTfulAPI签名机制火币签名认证规范