经过身份验证的Java Jersey REST调用Bitstamp

时间:2014-08-11 16:29:11

标签: java rest http encryption jersey

我正在尝试对Bitstamp进行私有REST调用(请参阅https://www.bitstamp.net/api/)。

但是,我得到了以下的共鸣:

{"错误":"缺少密钥,签名和随机数参数"}

在API规范中,他们编写以下内容:

  

所有私有API调用都需要身份验证。你需要提供3   用于验证请求的参数:

     
      
  • API密钥
  •   
  • 现时标志
  •   
  • 签名
  •   
     

API KEY

     

要获取API密钥,请转到"帐户","安全"然后" API访问"。   设置权限并单击"生成密钥"。

     

NONCE

     

Nonce是一个常规整数。它必须随着每一个增加   请求你。在这里阅读更多相关信息。示例:如果设置nonce   在第一次请求中,您必须将其设置为至少2   第二个请求。你不需要从1.开始   练习是对该参数使用unix时间。

     

SIGNATURE

     

签名是HMAC-SHA256编码的消息,包含:nonce,client   ID和API密钥。必须使用机密生成HMAC-SHA256代码   使用API​​密钥生成的密钥。必须转换此代码   它的十六进制表示(64个大写字符)。

我一直在努力解决这个问题,一切似乎都是有序的:使用加密创建签名并转换为HEX,在服务器上激活API访问,API密钥正在按顺序等。联系时Bitstamp他们告诉我API正常工作,我收到的错误通常发生在我的密钥,签名和参数没有到达他们的API时。在坚持了一段时间之后,我现在还没有找到解决这个问题的线索。请帮忙。

我的代码如下

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.codehaus.jettison.json.JSONObject;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.DatatypeConverter;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException


public class Connection {

private static WebResource baseResource;

private static final MediaType responseType = MediaType.APPLICATION_JSON_TYPE;


public Connection() throws NoSuchAlgorithmException {

    Client client = Client.create();
    baseResource = client.resource("https://www.bitstamp.net/api/");

}


public void test() throws NoSuchAlgorithmException, InvalidKeyException {

    String nonce_unixTime = String.valueOf(System.currentTimeMillis() / 1000L);
    String clientID = "xxx";
    String key = "yyy";
    String secret = "zzz";
    String message = nonce_unixTime + clientID + key;

    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
    sha256_HMAC.init(secret_key);
    byte[] hash = sha256_HMAC.doFinal(message.getBytes());
    String signature = DatatypeConverter.printHexBinary(hash).toUpperCase();

    // Fetch the resource.
    JSONObject json = baseResource.path("balance/")
            .queryParam("key", key)
            .queryParam("signature", signature)
            .queryParam("nonce", nonce_unixTime)
            .accept(responseType).post(JSONObject.class);

    System.out.println(json.toString());
}
}

1 个答案:

答案 0 :(得分:1)

这是因为bitstamp在POST的正文中等待params而不是url中的params,因此POST消息的类型必须是MediaType.APPLICATION_FORM_URLENCODED而不是JSONObject.class。

请参阅How are parameters sent in an HTTP POST request?

如何在泽西岛进行:Using the Jersey client to do a POST operation