in src/main/java/com/aliyun/openservices/log/http/signer/SlsV4Signer.java [188:244]
public String signRequest(Map<String, String> headers, HttpMethod httpMethod,
String resourceUri, Map<String, String> urlParams,
byte[] body, String dateTime) {
Credentials credentials = credentialsProvider.getCredentials();
addHeaderSecurityToken(credentials.getSecurityToken(), headers);
String contentSha256;
if (body != null && body.length > 0) {
headers.put(Consts.CONST_CONTENT_LENGTH, String.valueOf(body.length));
contentSha256 = BinaryUtil.toHex(BinaryUtil.calculateSha256(body));
} else {
headers.put(Consts.CONST_CONTENT_LENGTH, Consts.EMPTY_STRING_LENGTH);
contentSha256 = Consts.EMPTY_STRING_SHA256;
}
headers.put(Consts.X_LOG_DATE, dateTime);
headers.put(Consts.X_LOG_CONTENT_SHA256, contentSha256);
Map<String, String> canonicalHeaders = new TreeMap<String, String>();
StringBuilder signedHeaders = new StringBuilder();
for (Map.Entry<String, String> header : headers.entrySet()) {
String key = header.getKey().toLowerCase();
if (DEFAULT_SIGNED_HEADERS.contains(key)
|| key.startsWith(Consts.CONST_X_SLS_PREFIX)
|| key.startsWith(Consts.CONST_X_ACS_PREFIX)) {
canonicalHeaders.put(key, header.getValue());
}
}
StringBuilder headersToString = new StringBuilder();
for (Map.Entry<String, String> header : canonicalHeaders.entrySet()) {
if (signedHeaders.length() > 0) {
signedHeaders.append(";");
}
String headerKey = header.getKey();
signedHeaders.append(headerKey);
headersToString.append(headerKey)
.append(":")
.append(HttpUtil.trim(header.getValue()))
.append(NEW_LINE);
}
String signedHeadersStr = signedHeaders.toString();
String canonicalRequest = buildCanonicalRequest(httpMethod.toString(),
resourceUri, urlParams, headersToString.toString(), signedHeadersStr, contentSha256);
String date = dateTime.substring(0, 8);
String scope = buildScope(date);
String stringToSign = buildStringToSign(canonicalRequest, dateTime, scope);
Mac mac = getMacInstance();
HmacSHA256Hasher sha256Hasher = new HmacSHA256Hasher(mac);
byte[] signingKey = buildSigningKey(sha256Hasher, credentials.getAccessKeySecret(), region, date);
byte[] result = sha256Hasher.hash(signingKey, stringToSign.getBytes(CHARSET_UTF_8));
String signature = BinaryUtil.toHex(result);
String authorization = buildAuthorization(credentials.getAccessKeyId(), signature, scope);
// System.out.println("canonicalRequest:\n" + canonicalRequest);
// System.out.println("stringToSign:\n" + stringToSign);
// System.out.println("signingKey:\n" + BinaryUtil.toHex(signingKey));
// System.out.println("signature:\n" + signature);
// System.out.println("authorization:\n" + authorization);
return authorization;
}