gpt4 book ai didi

java - 尝试调用 Coinbase API 端点时,我收到 "invalid signature"错误

转载 作者:行者123 更新时间:2023-12-01 16:16:27 25 4
gpt4 key购买 nike

我目前正在尝试构建一个使用 Coinbase API 为我进行交易的个人应用程序。但是,每次尝试调用需要身份验证的端点时,我都会遇到相同的错误,“签名无效”。

我只是在这里发表这篇文章,因为我已经搜索了互联网(包括 stackoverflow),尝试了几乎所有解决方案,但没有一个有效。我的运行假设是我使用的HmacSHA256方法不正确,但我尝试了很多,但没有一个起作用。我做出这个假设是因为我的 HmacSHA256 方法的参数是:

字符串 SecretKey、字符串时间戳、字符串方法、字符串请求路径、字符串正文

预哈希字符串是时间戳+方法+请求路径+正文,并在预哈希字符串上使用 key 。

我已经验证了我的 key 是正确的(甚至创建了一个新的 API key 来确保这一点),验证了我的时间戳是正确的,因为如果它不正确,它不会检查 header (通过创建虚假时间戳进行测试,该错误每次都会首先被捕获),该方法是一个简单的“GET”,并且我不完全确定我的请求路径。我正在尝试调用https://api.coinbase.com/v2/accounts ,我假设“/v2/accounts”是请求路径。对于 GET 请求,正文是可选的。

这是我创建标题的位置:

    public static JSONObject getAccountData() {
String url = requests.getJSONObject("wallet_data").getString("requestPath");
String requestPath = "/v2/accounts";
String accessKey = credentials.getJSONObject("standard").getString("key");
String secretKey = credentials.getJSONObject("standard").getString("secret");
String method = "GET";
String timestamp = getEpochTime();
String body = "";
String header = HeaderGenerator.getHMACHeader(secretKey, timestamp, method, requestPath, body);


Request request = new Request.Builder()
.addHeader(CB_ACCESS_KEY, accessKey)
.addHeader(CB_ACCESS_SIGN, header)
.addHeader(CB_ACCESS_TIMESTAMP, timestamp)
.addHeader(CB_VERSION, getDate())
.addHeader("Accept", "application/json")
.url(url)
.build();

String show = "";
for(int i = 0; i < request.headers().size(); i++) {
show += (request.headers().name(i) + ": " + request.headers().get(request.headers().name(i)));
show+= "\n";
}
System.out.println(show);
Response res;
JSONObject par = null;
try {
res = APICommunicator.sendRequest(request);
par = new JSONObject(res);
} catch (IOException e) {
e.printStackTrace();
ErrorLogger.logException(e);
}
return par;
}

对于 HmacSHA256 方法:

    public static String getHMACHeader(String secretKey, String timestamp, String method, String requestPath, String body) {
String prehash = timestamp + method.toUpperCase() + requestPath;

if(method.equals("POST") || method.equals("PUT")) {
prehash += body;
}

byte[] secretDecoded = Base64.getDecoder().decode(secretKey);
SecretKey keyspec = new SecretKeySpec(secretDecoded, "HmacSHA256");
Mac sha256 = null;
try {
sha256 = (Mac) Mac.getInstance("HmacSHA256");
sha256.init(keyspec);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return Base64.getEncoder().encodeToString(sha256.doFinal(prehash.getBytes()));
}

我再次确保我的 API key 和 secret key 正确且已启用。

最佳答案

找到解决方案!

我使用的许多指南都利用了 Coinbase Pro 的 API,它使用 Base64 编码方案。在Normal Coinbase中,编码应该是Hex。

这是我更新的 getHMacHeader 方法:

    public static String getHMACHeader(String secretKey, String timestamp, String method, String requestPath, String body) {
String prehash = timestamp + method.toUpperCase() + requestPath;

if(method.equals("POST") || method.equals("PUT")) {
prehash += body;
}

SecretKeySpec keyspec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac sha256 = null;
try {
sha256 = (Mac) Mac.getInstance("HmacSHA256");
sha256.init(keyspec);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
}

String hash = Hex.encodeHexString((sha256.doFinal(prehash.getBytes())));

return hash;
}

关于java - 尝试调用 Coinbase API 端点时,我收到 "invalid signature"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62378897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com