首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Coinbase Pro API -无效签名

Coinbase Pro API -无效签名
EN

Stack Overflow用户
提问于 2019-05-19 04:12:46
回答 3查看 4.9K关注 0票数 3

这是根据原文编辑的:

从医生那里:

签署一条消息CB-访问标志标头是通过创建一个sha256 HMAC来生成的,使用base64 64解码的密钥对捕获的字符串时间戳+方法+ requestPath +主体(其中+表示字符串连接)和base64 64对输出进行编码。时间戳值与CB访问时间戳标头相同。

这是我删除的密钥中的信息。这是来自Coinbase Pro Sandbox的:

publicKey:

代码语言:javascript
运行
复制
06057d5b5e03d0f8587a248330402b21

passPhrase:

代码语言:javascript
运行
复制
gcgs6k6rp0f

secretKey:EFAToD5heo66GIgZlT2TIZzJf8TYlmxyeRxRYDHTBv3lTt9XN6uaNS0RNAy0os/caR47x6EiPDOV3Ik+YzrfEA==

我使用的是角,特别是node.js密码-js库:

代码语言:javascript
运行
复制
private generateSignaturePro(timestamp: string, method: string, resourceUrl: string, requestBody: string): string {
    var prehash: string = timestamp + method + resourceUrl + requestBody;
    var key = (Buffer.from(this.secretKey, 'base64')).toString();
    return crypto.enc.Base64.stringify(crypto.HmacSHA256(prehash, key));
}

服务器时间: 2019-05-20T19:01:38.711Z时代: 1558378898.711 (来自/time端点)

以下是我的请求和服务器响应:

请求:

代码语言:javascript
运行
复制
Request URL: https://api-public.sandbox.pro.coinbase.com/accounts
Request Method: GET
Status Code: 400 
Remote Address: 104.16.161.226:443
Referrer Policy: no-referrer-when-downgrade

请求头:

代码语言:javascript
运行
复制
Provisional headers are shown
Accept: application/json, text/plain, */*
CB-ACCESS-KEY: 06057d5b5e03d0f8587a248330402b21
CB-ACCESS-PASSPHRASE: gcgs6k6rp0f
CB-ACCESS-SIGN: 0cc2BnQYdUhLucXSPwMTjpHjJ32G3RXSH44rSsEopvjAtY90uRCMVy6xUrzg/A/aRJBLqx390fcZc7lmJeP++g==
CB-ACCESS-TIMESTAMP: 1558378899
Referer: https://localhost:44342/dashboard
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

响应头:

代码语言:javascript
运行
复制
access-control-allow-headers: Content-Type, Accept, cb-session, cb-fp
access-control-allow-methods: GET,POST,DELETE,PUT
access-control-allow-origin: *
access-control-expose-headers: cb-before, cb-after, cb-gdpr
access-control-max-age: 7200
cache-control: no-store
cf-cache-status: MISS
cf-ray: 4da08f74ba97cf68-IAD
content-length: 31
content-type: application/json; charset=utf-8
date: Mon, 20 May 2019 19:01:38 GMT
etag: W/"1f-4RjKVp8I05+xcnQ5/G16yRoMSKU"
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
status: 400
strict-transport-security: max-age=15552000; includeSubDomains
vary: Accept-Encoding
x-content-type-options: nosniff
x-dns-prefetch-control: off
x-download-options: noopen
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

响应:

代码语言:javascript
运行
复制
{"message":"invalid signature"}

我做错了什么?

编辑:将方法更改为SHA 256版本。还是不起作用。

EN

回答 3

Stack Overflow用户

发布于 2021-06-06 00:37:05

我遇到了同样的问题,我的代码基本上和你的一样。我更改为下面的(c#),它终于起作用了。奇怪的是,coinbase pro只是交换,到目前为止,我一直对签名有异议。无论如何,这是对我有用的代码。希望这能有所帮助。会帮我省下很多时间

代码语言:javascript
运行
复制
public string ComputeSignature(
        HttpMethod httpMethod,
        string secret,
        double timestamp,
        string requestUri,
        string contentBody = "")
    {
        var convertedString = System.Convert.FromBase64String(secret);
        var prehash = timestamp.ToString("F0", CultureInfo.InvariantCulture) + httpMethod.ToString().ToUpper() + requestUri + contentBody;
        return HashString(prehash, convertedString);
    }

private string HashString(string str, byte[] secret)
{
        var bytes = Encoding.UTF8.GetBytes(str);
        using (var hmaccsha = new HMACSHA256(secret))
        {
            return System.Convert.ToBase64String(hmaccsha.ComputeHash(bytes));
        }
}
票数 3
EN

Stack Overflow用户

发布于 2019-05-29 12:46:01

gdax-java (因为它在"coinbase pro“之前命名)库中,生成签名方法是:

代码语言:javascript
运行
复制
 String prehash = timestamp + method.toUpperCase() + requestPath + body;

 byte[] secretDecoded = Base64.getDecoder().decode(secretKey);
 keyspec = new SecretKeySpec(secretDecoded, "HmacSHA256");
 sha256 = (Mac) GdaxConstants.SHARED_MAC.clone();
 sha256.init(keyspec);
 return Base64.getEncoder().encodeToString(sha256.doFinal(prehash.getBytes()));

至少在初始检查时,您使用的代码指定使用SHA512而不是HmacSHA256,因此我怀疑这是一个可能的原因。

这里的右边列中还有更多关于NodeJS的帮助,用于生成签名。https://docs.pro.coinbase.com/#creating-a-request

票数 1
EN

Stack Overflow用户

发布于 2021-11-14 01:05:29

这里也有同样的问题。对我来说,答案是使用luxon DateTime而不是本机js日期函数,如coinbase文档中所示。

这是对我有用的打字稿。可以使用此函数的结果填充请求标头。

代码语言:javascript
运行
复制
import crypto from 'crypto';
import { DateTime } from 'luxon';

export const auth = (
  method: 'GET' | 'POST',
  path: string,
  body?: Record<string, unknown>
) => {
  const timestamp = DateTime.utc().toMillis() / 1000;
  let message = timestamp + method + path;

  if (body) {
    message += JSON.stringify(body);
  }

  const secret = Buffer.from('YOUR_SECRET','base64');
  const hmac = crypto.createHmac('sha256', secret);

  return {
    'CB-ACCESS-KEY': 'YOUR_KEY',
    'CB-ACCESS-PASSPHRASE': 'YOUR_PASSPHRASE',
    'CB-ACCESS-SIGN': hmac.update(message).digest('base64'),
    'CB-ACCESS-TIMESTAMP': timestamp.toString()
  };
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56204699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档