Can you help? I am getting on v2/groups in Groovy?

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)
  }



Best Answer

  • Prabhjyot
    Answer ✓

    @navinchandra.markandeya,

    Thanks for sharing the details.

    The timestamp between the request and the response headers is more than 30 seconds and is the cause of error 401. The acceptable timestamp difference is less then 30 seconds.

    Can you please update your system clock and sync it with the NTP and try again?

    Please share the updated request and response headers if you are still encountering error 401.

Answers