I tried troubleshooting, however I am not getting anywhere, likely the hmac calculation is incorrect. Please help.
@Test
void testResponse() {
final String instant = timeInGMT()
final String host = "rms-world-check-one-api-pilot.thomsonreuters.com"
final String gatewayUrl = "/v2/groups"
final String url = "https://" + host + gatewayUrl
final String apiKey = "MY-KEY"
final String apiSecret = "MY-SECRET"
final String dataToSign = "(request-target): get " + gatewayUrl + "\n" + "host: " + host +
"\n" + "date: " + instant
final String hmac = calcHmacSha256(
apiSecret.getBytes(StandardCharsets.UTF_8),
dataToSign.getBytes(StandardCharsets.UTF_8)
)
final String authorization = "Signature keyId=\"" + apiKey +
"\",algorithm=\"hmac-sha256\",headers=\"(request-target) host date\",signature=\"" + hmac + "\""
final OkHttpClient client = new OkHttpClient()
final Request request = new Request.Builder()
.url(url)
.header("Cache-Control", "no-cache")
.header("Authorization", authorization)
.header("Date", instant)
.build()
final Call call = client.newCall(request)
final Response response = call.execute()
assert response.code() == HttpStatus.SC_OK
}
private String timeInGMT() {
final Date currentTime = new Date()
final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d yyyy HH:mm:ss z")
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))
return sdf.format(currentTime)
}
private String calcHmacSha256(byte[] secretKey, byte[] message) {
byte[] hmacSha256
try {
Mac mac = Mac.getInstance("HmacSHA256")
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256")
mac.init(secretKeySpec)
hmacSha256 = mac.doFinal(message)
} catch (Exception e) {
throw new RuntimeException("Failed to calculate hmac-sha256", e)
}
return new String(Base64.encoder.encode(hmacSha256), StandardCharsets.UTF_8)
}