调用API 当然安全很重要,不然谁都可以调用显然不行。这个方法还是参照百度云存储的,我自己定义了规则
前缀URL:http://192.168.1.161/cargo
提交参数说明
字段 | 取值 | 是否必须 | 描述 |
---|---|---|---|
ak | 是 | 系统分配的的appKey | |
time | 是 | 当前时间,格式yyyyMMddHHmmss 不能与服务器时间相差大于5分钟 | |
token | - | 非登录接口必须,该值从登录后返回的用户信息获取 | |
ip | 否 | IP限制 | |
sign | 是 | 用系统分配的密钥进行URL签名 |
以上参数用GET方式传输 如:http://192.168.1.161/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&time=20140827203145&ip=8.8.8.8&sign=xxxxxxxx
签名方法: 对参数的每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推。 排序完成之后,再把所有数组值以“&”字符连接起来,如上面的URL则为:ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145 如遇特殊字符,前面字符串扔是原字符串,但是传递时需进行url编码 例如:需要对请求参数email进行数字签名,那么待签名数据应该是email=admin@kecq.com,而不是email=admin%40kecq.com。但是传递则是email=admin%40kecq.com 再将此字符串与相对url和问号进行连接。如:/cargo/User/Login.ashx? 注意以"/"开头 那么最后的签名字符串就是: /cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145 再对此字符串进行HMACSHA1 签名,再进行Base64编码,再对Base64编码后的字符串进行Url编码 最后请求url则为http://192.168.1.161/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&time=20140827203145&ip=8.8.8.8&sign=xxxxxxxx
公共返回示例:{"code":"-1","message":"登录名或密码错误"}
结果说明:code代表返回的代码,大于0表示成功,小于0表示失败,message代表返回结果描述
appKey:e10d8f2c03e3411f93b516d247f7e1d4
AppSecret:d67fac11da1e45a28af2c946e3992449
JAVA签名示例:
byte[] key="d67fac11da1e45a28af2c946e3992449".getBytes("utf-8"); byte[] data="/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145".getBytes("utf-8"); SecretKeySpec signingKey = new SecretKeySpec(key, "HMAC_SHA1"); Mac mac = Mac.getInstance("HMAC_SHA1"); mac.init(signingKey); byte[] signByte = mac.doFinal(data); String sign2=new String(it.sauronsoftware.base64.Base64.encode(signByte)); System.out.print(sign2);
c# 对数据hmac签名的代码
/// <summary> /// 对数据进行Hmac签名 /// </summary> /// <param name="valueStr">要签名的数据</param> /// <param name="keyStr">密钥</param> /// <returns></returns> public static string Hmac(string valueStr, string keyStr) { HMAC hmac = HMACSHA1.Create(); //源数据 var data = System.Text.Encoding.UTF8.GetBytes(valueStr); //密钥 var key = System.Text.Encoding.UTF8.GetBytes(keyStr); //设置密钥 hmac.Key = key; //计算哈希值 var hash = hmac.ComputeHash(data); //对数据进行签名 var signedData = hash.Concat(data).ToArray(); var receivedHash = signedData.Take(hmac.HashSize >> 3).ToArray(); String str = HttpUtility.UrlEncode(Convert.ToBase64String(receivedHash)); return str; }