2017-12-07 3 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)) 

긴 WAY :

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

짧은 방법. 이상하게도 나는 이와 비슷한 문제에 봉착했다. 짧은 방법 은 대문자 HEX를 생성하고, ^^ 위의 ^^는 소문자 HEX로 변환하기 때문이다. CoinBase API는 소문자로만 16 진수로 서명을 수락합니다.

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

이제 서명을 알아 냈으므로 나머지는 훌륭하게 작동해야합니다. 내가 OWN API 버전을 기본값으로하기 때문에 CB_VERSION을 제거했습니다. 내 기본 설정이 다르므로 간단히 제거했습니다. https://github.com/cmaahs/BittrexAPI/tree/master/Encryption : 옆으로 개인 키/비밀을 저장하기에 여기에 몇 가지 아이디어를 찾을 수 있습니다으로

$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

정말 대단하다 !!! ... Coinbase 문서화 API의 서명에 소문자 HEX를 놓쳤습니다. –

+0

적어도 명시된 것 같지 않습니다. 필자는 먼 길은 소문자 버전을 만들어 내고 운 좋았습니다. –

관련 문제