title: Coinbase Api Java POST request "Invalid Signature"
body: <p>I am trying to send a POST request to the coinbase sandbox endpoint. When signing the request I always get an "Invalid Signature" response. It seems that coinbase requires the JSON message be base 64 encoded and sent as a part of the signature. I am fairly new to POST requests and have never signed a message before. Can someone please let me know what I am doing wrong. I have been stuck on this issue for a week so any input is much appreciated. </p>
  
  <p>The relevant part of my code is below</p>
  
  <pre><code>public void postOrder() throws InvalidKeyException, NoSuchAlgorithmException, CloneNotSupportedException, ClientProtocolException, IOException {
  
      String message = "{ \n"+
                 " \"size\":\"1.00\", \n"+
                 " \"price\":\"0.80\", \n"+
                 " \"side\":\"buy\", \n"+
                 " \"product_id\":\"BTC-USD\" \n"+
                 "}"; 
  
      JSONObject json = new JSONObject(message);
      message = json.toString();
      try
      {
              String timestamp= Instant.now().getEpochSecond()+"";
              String accessSign = getAccess(timestamp,"POST","/orders",message);
              String apiKey = properties.getProperty("key");
              String passphrase = properties.getProperty("passphrase");
  
              URL url = new URL("https://api-public.sandbox.pro.coinbase.com/orders");
              HttpURLConnection connection = (HttpURLConnection)url.openConnection();
              connection.setDoOutput(true); 
              connection.setRequestProperty("accept", "application/json");
              connection.setRequestProperty("content-type", "application/json; charset=UTF-8");
              connection.setRequestProperty("CB-ACCESS-KEY", apiKey);
              connection.setRequestProperty("CB-ACCESS-SIGN", accessSign);
              connection.setRequestProperty("CB-ACCESS-TIMESTAMP", timestamp);
              connection.setRequestProperty("CB-ACCESS-PASSPHRASE", passphrase);
              connection.setRequestProperty("User-Agent", "Java Client"); 
  
            try { 
              connection.getOutputStream().write(message.getBytes("UTF-8"));
              OutputStream output = connection.getOutputStream(); 
              output.write(param.getBytes("UTF-8"));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
  
            String status = connection.getResponseMessage();
              System.out.println("STATUS: "+status);  
  
       }catch(Exception e) {
          System.out.println(e.getMessage());
       }
       return;
  }
  
  
   private String getAccess(String timestamp, String method, String path, String param) throws NoSuchAlgorithmException, InvalidKeyException, CloneNotSupportedException, IllegalStateException, UnsupportedEncodingException {
  
          String secretKeyString = properties.getProperty("secret");
  
          String prehash = timestamp+method+path+param;
          byte[] secretKeyDecoded = Base64.getDecoder().decode(secretKeyString);
          SecretKey secretKey = new SecretKeySpec(secretKeyDecoded, "HmacSHA256");
          Mac hmacSha256 = Mac.getInstance("HmacSHA256");
          hmacSha256.init(secretKey);
  
          return Base64.getEncoder().encodeToString(hmacSha256.doFinal(prehash.getBytes()));
   }
  </code></pre>