2017-12-07 18 views
0

Powershellを使用したCoinbase APIによる口座残高を取得したいと考えています。PowershellによるCoinbase APIの無効な署名

私は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 

答えて

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)) 

LONG WAY:

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

短い方法。奇妙なことに、私はこの短い問題を抱えていました。短い方法である が大文字小文字を生成し、^^上記^^は小文字の小文字に変換されるためです。 CoinBase APIは、小文字の16進数でのみ署名を受け入れます。

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

署名が得られたので、残りの部分はすばらしく動作するはずです。私はCB_VERSIONを削除しました。なぜならあなたのOWN APIのバージョンがデフォルトになるからです。私のデフォルトは違っていたので、単に削除しました。 https://github.com/cmaahs/BittrexAPI/tree/master/Encryption:脇PRIVATE KEY/SECRETを保存するには、あなたがここにいくつかのアイデアを見つけることができるよう

$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 

。それをつかんで自由に変更してください。スクリプト内のプレーンテキストや環境変数としてではなく、レジストリに暗号化されたKEY/SECRETを格納する方がよいでしょう。

+0

本当に素晴らしい!!!コインベースのドキュメントAPIの署名で小文字のHEXを見逃した... –

+0

私はそれが指定されたとは思わない、少なくとも私が見たものではない、私は長い道のりが小文字のバージョンを作り、働いたことは幸運だった。 –