Недействительная подпись Coinbase API с Powershell

Я хочу получить баланс аккаунта через 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

person Marco Braidotti    schedule 07.12.2017    source источник


Ответы (1)


Надеюсь, это поможет вам. Я только начал работать над модулем сегодня и застрял на одном и том же. Я наткнулся на ваш вопрос, пытаясь решить проблему самостоятельно. Подумал, что поделюсь тем, что нашел. Удачи!

$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 
}

Короткий путь. Как ни странно, я застрял на этой же проблеме, потому что короткий путь производит ВЕРХНИЙ РЕГИСТР HEX, а длинный путь ^^ выше ^^ преобразуется в нижний регистр HEX. CoinBase API будет принимать ТОЛЬКО подпись в HEX нижнем регистре.

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

Теперь, когда у нас есть подпись, все остальное должно работать отлично. Я удалил CB_VERSION, потому что по умолчанию он будет использовать вашу СОБСТВЕННУЮ версию 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

Помимо хранения ЧАСТНОГО КЛЮЧА / СЕКРЕТА, вы можете найти некоторые идеи здесь: https://github.com/cmaahs/BittrexAPI/tree/master/Encryption. Не стесняйтесь брать его и изменять по своему усмотрению. Лучше хранить ваш KEY / SECRET в зашифрованном виде в реестре, а не как обычный текст в вашем скрипте или как переменные среды.

person CJ Maahs    schedule 12.12.2017
comment
действительно удивительным!!! пропустил нижний регистр HEX в подписи в API документации Coinbase ... - person Marco Braidotti; 12.12.2017
comment
Я не думаю, что это было указано, по крайней мере, я не видел, мне просто повезло, что долгий путь произвел версию в нижнем регистре и сработал. - person CJ Maahs; 13.12.2017