【问题标题】:coinbase api invalid signature error python on get request获取请求时的coinbase api无效签名错误python
【发布时间】:2021-03-29 00:03:51
【问题描述】:

试图在 coinbase 中查看我列出的帐户,我已经生成了我的 hmac 哈希并且没有收到任何错误但是由于某种原因我仍然收到 {'message': 'invalid signature'} 和 401 错误,我什至尝试在 coinbase 中创建一个新密钥确保这不是问题

这是我的参考代码我刚刚开始,所以我几乎没有什么可展示的,我正在尝试制作此处显示的 api 文档的准系统版本https://docs.pro.coinbase.com/#signing-a-message

我已经检查以确保我的 api 密钥已启用并且可以正确访问 coinbase api,但老实说,文档肯定可以使用一些工作,因为我在堆栈和 github 上看到了很多类似的未回答问题和我认为有些东西被遗漏了,我也在下面将我的签名哈希转换为小写,正如另一篇文章中推荐的那样


def get_accounts(self):
        print("getting accounts")
        secret = bytes(self.secret, 'UTF-8')

        #unicode objects must be encoded before hashing?? what is that??
        timestamp = str(time.time())
        message = timestamp + 'GET' + self.baseurl + 'accounts' + ''
        message = bytes(message, 'UTF-8')
      
        hmac_key = base64.b64decode(secret)
        signature = hmac.new(hmac_key, message, hashlib.sha256)
        signature = signature.hexdigest()
        print('signature',signature)
     

        #final base 64 byte string to send, but we probably need a regular string
        signature_b64 = base64.b64encode(bytes(signature, 'UTF-8'))
        signature_b64 = signature_b64.decode("utf-8") 
        
        print('final',signature_b64.lower())

        headers = {
            'CB-ACCESS-SIGN': signature_b64.lower(),
            'CB-ACCESS-TIMESTAMP': timestamp,
            'CB-ACCESS-KEY': self.key,
            'CB-ACCESS-PASSPHRASE': self.passphrase,
            'Content-Type': 'application/json'
        }
       
        r = requests.get(self.baseurl + 'accounts', headers=headers)
        print (r.status_code)
        print( r.json())

【问题讨论】:

  • 这方面有进展吗?
  • ehhhhh 不抱歉

标签: python python-requests coinbase-api


【解决方案1】:

这对我有用:

timestamp = str(time.time())
message = timestamp + request.method + request.path_url
message = message.encode('utf-8')
if request.body:
    message = message + request.body
hmac_key = base64.b64decode(self.api_secret)
signature = hmac.new(hmac_key, message, hashlib.sha256)
signature_b64 = base64.b64encode(signature.digest()).decode('utf-8')

request.headers.update({
    'CB-ACCESS-SIGN': signature_b64,
    'CB-ACCESS-TIMESTAMP': timestamp,
    'CB-ACCESS-KEY': self.api_key,
    'CB-ACCESS-PASSPHRASE': self.api_pass,
    'Content-Type': 'application/json'
})

【讨论】:

  • 哇,谢谢分享,我现在正在玩我的,看看它的比较,你有你正在使用的请求对象的样本吗? :P
  • order = { 'type': 'market', 'side': 'buy', 'product_id': "BTC-USD", 'size': 100.0, } response = requests.post("https://api.pro.coinbase.com/orders", json=order, auth=auth) 验证来自docs.pro.coinbase.com/?python#creating-a-request的示例代码
【解决方案2】:

我整个下午都在为此苦苦挣扎,发现coinbasepro python 模块是我的解决方案。

import coinbasepro
auth_client = coinbasepro.AuthenticatedClient(
    key=os.getenv(f'COINBASE_API_KEY'),
    secret=os.getenv(f'COINBASE_API_SECRET'),
    passphrase=os.getenv(f'COINBASE_API_PASSPHRASE')
)
accounts = auth_client.get_accounts()

coinbase-commerce、coinbase[DEPRECATED]、coinbase 和 coinbasepro python 模块都具有不同的使用模式,这无济于事。

另外,请确保您没有切换 API KEY(较短)和 API SECRET KEY(较长)。

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多