开发者社区> 问答> 正文

API 签名机制(Java示例代码1)


Java 示例代码

[font=PingFangSC, "]本示例不需要依赖第三方的库包,可以直接使用。签名步骤如下所示。


  1. 构造规范化的请求字符串(排序及 URL 编码)。

public static Map<String, String> splitQueryString(String url)
         throws URISyntaxException, UnsupportedEncodingException {
     URI uri = new URI(url);
     String query = uri.getQuery();
     final String[] pairs = query.split("&");
     TreeMap<String, String> queryMap = new TreeMap<String, String>();
     for (String pair : pairs) {
         final int idx = pair.indexOf("=");
         final String key = idx > 0 ? pair.substring(0, idx) : pair;
         if (!queryMap.containsKey(key)) {
             queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1),
                     CHARSET_UTF8));
         }
     }
     return queryMap;
}
/** 对参数名称和参数值进行URL编码**/
public static String generate(String method, Map<String, String> parameter,
                               String accessKeySecret) throws Exception {
     String signString = generateSignString(method, parameter);
     System.out.println("signString---" + signString);
     byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString);
     String signature = newStringByBase64(signBytes);
     System.out.println("signature---" + signature);
     if ("POST".equals(method))
         return signature;
     return URLEncoder.encode(signature, "UTF-8");
}




2.构造成待签名的字符串。 public static String generateSignString(String httpMethod,
                                         Map<String, String> parameter) throws IOException {
     TreeMap<String, String> sortParameter = new TreeMap<String, String>();
     sortParameter.putAll(parameter);
     String canonicalizedQueryString = UrlUtil.generateQueryString(
             sortParameter, true);
     if (null == httpMethod) {
         throw new RuntimeException("httpMethod can not be empty");
     }
     /** 构造待签名的字符串* */
     StringBuilder stringToSign = new StringBuilder();
     stringToSign.append(httpMethod).append(SEPARATOR);
     stringToSign.append(percentEncode("/")).append(SEPARATOR);
     stringToSign.append(percentEncode(canonicalizedQueryString));
     return stringToSign.toString();
}


3.计算待签名字符串的 HMAC 值。 public static byte[] hmacSHA1Signature(String secret, String baseString)
         throws Exception {
     if (isEmpty(secret)) {
         throw new IOException("secret can not be empty");
     }
     if (isEmpty(baseString)) {
         return null;
     }
     Mac mac = Mac.getInstance("HmacSHA1");
     SecretKeySpec keySpec = new SecretKeySpec(
             secret.getBytes(CHARSET_UTF8), ALGORITHM);
     mac.init(keySpec);
     return mac.doFinal(baseString.getBytes(CHARSET_UTF8));
}
private static boolean isEmpty(String str) {
    return (str == null || str.length() == 0);
}

展开
收起
云栖大讲堂 2017-10-19 15:08:28 3619 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
CUDA MATH API 立即下载
API PLAYBOOK 立即下载
传统企业的“+互联网”-API服务在京东方的实践 立即下载