使用Powershell进行Coinbase API无效签名

时间:2017-12-07 22:41:57

标签: api powershell coinbase-api

我想通过Coinbase API和Powershell检索帐户余额。

我使用coinbase api文档编写了以下读数,但最后一个请求引发了以下错误:

Invoke-RestMethod : {"errors":[{"id":"authentication_error","message":"invalid signature"}]}

这是我的代码。 怎么了?谢谢。

$accounts = 'https://api.coinbase.com/v2/accounts'
$time = 'https://api.coinbase.com/v2/time'
$epochtime = [string]((Invoke-WebRequest $time | ConvertFrom-Json).data).epoch

$method = 'GET'
$requestpath = '/v2/accounts'
$secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

$sign = $epochtime + $method + $requestpath
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Convert]::FromBase64String($secret_key)
$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($sign))
$signature = [Convert]::ToBase64String($signature)

$header = @{
"CB-ACCESS-SIGN"=$signature
"CB-ACCESS-TIMESTAMP"=$epochtime
"CB-VERSION" = '2017-08-07'
"CB-ACCESS-KEY"='xxxxxxxxxxxxxx'
}

Invoke-WebRequest $accounts -Headers $header

1 个答案:

答案 0 :(得分:0)

希望这会让你前进。我今天刚刚开始研究一个模块并且遇到了同样的问题。我试图自己解决问题时遇到了你的问题。想我会分享我发现的东西。祝你好运!

$accounts = 'https://api.coinbase.com/v2/accounts'
$time = 'https://api.coinbase.com/v2/time'
$epochtime = [string]((Invoke-WebRequest $time | ConvertFrom-Json).data).epoch

$method = 'GET'
$requestpath = '/v2/accounts'
$secret_key = (Get-CoinBaseAPIKeys).Secret

$sign = $epochtime + $method + $requestpath
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Text.Encoding]::UTF8.GetBytes($secret_key)
$computeSha = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($sign))

长篇大论,供参考:

$signature = ""
foreach ( $c in $computeSha )
{
    $signature += "{0:x2}" -f $c 
}

简短的方法。奇怪的是,我被困在这个相同的问题上,因为方法很短 产生UPPER CASE HEX并且^^以上的长路^^转换为小写的HEX。 CoinBase API仅以小写形式接受HEX中的签名。

$signature = ([System.BitConverter]::ToString($computeSha) -replace "-").ToLower()

现在我们已经找到了签名,其余的应该很有效。我删除了CB_VERSION,因为它将默认为您的OWN API版本。我的默认设置不同,所以我只是将其删除了。

$header = @{
"CB-ACCESS-SIGN"=$signature
"CB-ACCESS-TIMESTAMP"=$epochtime
"CB-ACCESS-KEY"=(Get-CoinBaseAPIKeys).Key
}

$result = Invoke-WebRequest $accounts -Headers $header -Method Get -ContentType "application/json"
$accounts = $result.Content | ConvertFrom-Json
Write-Output $accounts.data

除了存储PRIVATE KEY / SECRET之外,你可以在这里找到一些想法: https://github.com/cmaahs/BittrexAPI/tree/master/Encryption。随意抓住并随意修改。最好将KEY / SECRET加密存储在注册表中,而不是作为脚本中的纯文本或环境变量存储。