GDAX Post Call 返回无效签名

Posted

技术标签:

【中文标题】GDAX Post Call 返回无效签名【英文标题】:GDAX Post Call returns invalid signature 【发布时间】:2017-12-27 05:43:42 【问题描述】:

我正在尝试在 GDAX 上发帖请求。 但我总是收到“无效签名”消息。 GDAX API Docs 用于创建请求+签名:https://docs.gdax.com/#creating-a-request

Preshash 字符串返回以下内容:

1500627733POST/orders"price":"1000.0","size":"0.02","type":"limit","side":"sell","product_id":"BTC-EUR"

我的签名方法:

public String generateSignature(String requestPath, String method, String body, String timestamp) 
        try 
            String prehash = timestamp + method.toUpperCase() + requestPath + body;
            byte[] secretDecoded = Base64.getDecoder().decode(secretKey);
            SecretKeySpec keyspec = new SecretKeySpec(secretDecoded, "HmacSHA256");
            Mac sha256 = (Mac) Mac.getInstance("HmacSHA256").clone();
            sha256.init(keyspec);
            return Base64.getEncoder().encodeToString(sha256.doFinal(prehash.getBytes()));
         catch (Exception e) 
            e.printStackTrace();
        
        return null;
    

我的请求方式:

private boolean placeLimitOrder(String currencyPair, String side, String price, String size)
            throws UnirestException 

        String timestamp = Instant.now().getEpochSecond() + "";
        String api_method = "/orders";
        String path = base_url + api_method; //base_url = https://api.gdax.com
        String method = "POST";
        String b = "\"price\":\"1000.0\",\"size\":\"0.02\",\"type\":\"limit\",\"side\":\"sell\",\"product_id\":\"BTC-EUR\"";
        JsonNode n = new JsonNode(b);
        String sig = generateSignature(api_method, method,b, timestamp);

        HttpResponse<JsonNode> rep = Unirest.post(path).header("accept", "application/json")
                .header("content-type", "application/json")
                .header("CB-ACCESS-KEY", publicKey)
                .header("CB-ACCESS-PASSPHRASE", passphrase)
                .header("CB-ACCESS-SIGN", sig)
                .header("CB-ACCESS-TIMESTAMP", timestamp)
                .body(n)
                .asJson();

        System.out.println(rep.getStatusText()); //Bad Request

        System.out.println(rep.getBody().toString()); //invalid signature

        System.out.println(sig); //returns something


        return false;
    

我还尝试使用 Insomnia 进行 API 请求调用,但它返回相同的消息(“无效签名”)。

有什么线索吗?

非常感谢您!

【问题讨论】:

我面临同样的问题。您对此有任何解决方案吗? 也遇到了这个问题,你有没有想过如何解决这个问题? 同样的问题 同样的问题。我希望有人能解释他们是如何修复它的;) 【参考方案1】:

看起来您正在签署价格订单数据,它是一个字符串,但对于帖子中的正文,您正在将其转换为 json 节点。当 gdax 解码签名并将有效负载数据与解密的(签名正文)进行比较时,这可能不匹配。

为什么不直接将字符串作为正文发送并删除“.asJson”?

.body(b)

当我在 C# 中测试 API 时,我遇到了类似的问题。经过3个下午的尝试。我测试了将数据作为字符串发送,并且能够通过无效签名错误。

【讨论】:

【参考方案2】:

我遇到了同样的问题。

我用的是http:

但正确的一个httpS:

问题解决了。

【讨论】:

以上是关于GDAX Post Call 返回无效签名的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce API Post 方法不适用于通过 POSTMAN 的 HTTP 请求 - 获取无效签名

支付宝接口开发提示错误代码 invalid-signature 错误原因: 无效签名

即使我在授权中输入令牌,JWT 仍返回无效签名错误

签署令牌如何工作? (无效签名错误)

Google Oauth2 verifyIdToken 返回具有有效 id_token 的无效令牌签名

签名中的团队 ID 无效