Skip to content

Instantly share code, notes, and snippets.

@fivesmallq
Last active August 29, 2015 14:21
Show Gist options
  • Save fivesmallq/9482ca783578f1356243 to your computer and use it in GitHub Desktop.
Save fivesmallq/9482ca783578f1356243 to your computer and use it in GitHub Desktop.
NovaData API signature demo
package com.novacloud.data;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* NovaData API signature demo.
* 代码参考 https://github.com/fit2cloud/qingcloud-api-java-wrapper/blob/master/src/main/java/com/fit2cloud/qingcloud/wsclient/QingCloudWSClient.java
*/
public class App {
private static final String ENCODING = "UTF-8";
private static String accessKeyId="NOVADATAACCESSKEYIDEXAMPLE";
private static String secretKey="SECRETACCESSKEY";
public static void main(String[] args) throws UnsupportedEncodingException {
String method = "GET";
Map<String, String> params = new HashMap<String, String>();
params.put("access_key_id", accessKeyId);
params.put("fields", "data.*");
params.put("limit", "2");
params.put("offset", "10");
params.put("signature_version", "1");
params.put("sort", "price:desc");
String signature=computeSignature(method, params);
System.out.println(signature);
System.out.println(percentEncode(signature));
}
public static String computeSignature(String httpMethod,
Map<String, String> parameters) {
String[] sortedKeys = parameters.keySet().toArray(new String[]{});
Arrays.sort(sortedKeys);
final String SEPARATOR = "&";
StringBuilder sbStringToSign = new StringBuilder();
sbStringToSign.append(String.format("%s\n/v1/data/websites/1\n", httpMethod));
String signature = "";
try {
int count = 0;
for (String key : sortedKeys) {
if (count != 0) {
sbStringToSign.append(SEPARATOR);
}
sbStringToSign.append(percentEncode(key)).append("=")
.append(percentEncode(parameters.get(key)));
count++;
}
String strToSign = sbStringToSign.toString();
signature = calculateSignature(secretKey, strToSign);
} catch (UnsupportedEncodingException e) {
} catch (Exception e) {
}
return signature;
}
private static String calculateSignature(String key, String stringToSign) {
final String ALGORITHM = "HmacSHA256";
byte[] signData = null;
try {
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
signData = mac.doFinal(stringToSign.getBytes(ENCODING));
} catch (InvalidKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (UnsupportedEncodingException e) {
} catch (IllegalStateException e) {
}
return new String(Base64.encodeBase64(signData));
}
private static String percentEncode(String value)
throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, ENCODING)
.replace("+", "%20").replace("*", "%2A").replace("%7E", "~")
: null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment