【问题标题】:Coinbase API returns 401 for POSTCoinbase API 为 POST 返回 401
【发布时间】:2018-01-05 01:24:51
【问题描述】:

我正在尝试使用 Coinbase 的 API 销售加密货币,但我不断收到 401 错误。下面的代码适用于我迄今为止尝试过的所有 GET 方法,但我无法弄清楚我的 POST 哪里出错了。

    private static string GetWebResponse(string url, string command, string path, string body)
    {
        var timeStamp = EpochSeconds;
        var request = (HttpWebRequest)WebRequest.Create(url);

        request.Method = command;
        request.ContentType = "application/json";
        request.Headers.Add("CB-VERSION", VersionDate);
        request.Headers.Add("CB-ACCESS-KEY", ApiKey);
        request.Headers.Add("CB-ACCESS-SIGN", GetAccessSign(timeStamp, command, path, body));
        request.Headers.Add("CB-ACCESS-TIMESTAMP", timeStamp);

        if (command == "POST")
        {
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(body);
                streamWriter.Flush();
                streamWriter.Close();
            }
        }

        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
        {
            return reader.ReadToEnd();
        }
    }

    private static string GetAccessSign(string timestamp, string command, string path, string body)
    {
        var hmacKey = Encoding.UTF8.GetBytes(ApiSecret);

        string data = timestamp + command + path + body;
        using (var signatureStream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
        {
            return new HMACSHA256(hmacKey).ComputeHash(signatureStream).Aggregate(new StringBuilder(), (sb, b) => sb.AppendFormat("{0:x2}", b), sb => sb.ToString());
        }
    }

我认为 POST 请求的正文有问题,但在我看来是正确的。

编辑:

为了澄清,我将展示身体是如何形成的......

            var body = JsonConvert.SerializeObject(
            new
            {
                commit = "false",
                amount = Math.Round(sellAmount, 8).ToString(),
                currency = "BTC",
                payment_method = fiatWalletId
            });

编辑 2:

我尝试了所有与以前相同的东西,但使用了 RestSharp,它返回了一个更具体的错误:

{\"errors\":[{\"id\":\"authentication_error\",\"message\":\"invalid signature\"}]}

编辑 3:

此 API 密钥已针对所有权限/范围设置,包括我对此请求所需的权限:

wallet:accounts:create wallet:accounts:delete wallet:accounts:read wallet:accounts:update wallet:addresses:create wallet:addresses:read wallet:buys:create wallet:buys:read wallet:checkouts:create wallet:checkouts:read wallet:contacts:read wallet:deposits:create wallet:deposits:read wallet:notifications:read wallet:orders:create wallet:orders:read wallet:orders:refund wallet:payment-methods:delete wallet:payment-methods:limits wallet:payment-methods:read wallet:sells:create wallet:sells:read wallet:transactions:read wallet:transactions:request wallet:transactions:send wallet:transactions:transfer wallet:user:email wallet:user:read wallet:user:update wallet:withdrawals:create wallet:withdrawals:read

【问题讨论】:

  • 401 是未经授权的,所以我假设您已经检查过您的 api 密钥是否正确等?
  • 尝试最简单的请求,也许是一个获取时间的 GET 请求,看看是否可行。 developers.coinbase.com/api/v2#time
  • 我可以在 Coinbase 上的钱包上进行 GET,所以我知道请求格式正确,并且它通过了 GET 请求的授权(没有正文),所以我希望它与json 正文。
  • 你的结论不正确。 401 是unauthorized。你在调用什么 API?请指明具体的 URL。 Coinbase 有一个权限系统,因此您使用的帐户完全有可能没有为 POST 调用设置适当的权限。
  • 请参阅my answer on a related question 了解我的意思。您需要为您的帐户添加适当的范围,以便您可以调用 POST 方法。我没有使用过 Coinbase 或其 API,我只是觉得这是我以前见过的东西。不是 100% 肯定这解释了您的问题。

标签: c# api coinbase-api


【解决方案1】:

对我来说,解决方案是我忘记将 /v2 (/v2 + some path) 放在签名的路径部分并且签名不好,虽然说未经授权,但响应具有误导性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2017-04-04
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多