I'm trying to use the Bitfinex REST API V2.0 and here there is a description of how a request should be authenticated. Here below is my golang
implementation:
func (c *Client) newAuthenticatedRequest(method string, refURL string, data map[string]interface{}) (*http.Request, error) {
path := "auth/r/" + refURL
rel, err := url.Parse(path)
if err != nil {
return nil, err
}
payload := "{}"
if data != nil {
p, err := json.Marshal(data)
if err != nil {
return nil, err
}
payload = string(p)
}
url := c.BaseURL.ResolveReference(rel)
req, err := http.NewRequest(method, url.String(), strings.NewReader(payload))
if err != nil {
return nil, err
}
nonce := utils.GetNonce()
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
req.Header.Add("bfx-nonce", nonce)
req.Header.Add("bfx-apikey", c.APIKey)
req.Header.Add("bfx-signature", c.signPayload("/api/v2/" + path + nonce + payload))
return req, nil
}
func (c *Client) signPayload(payload string) string {
sig := hmac.New(sha512.New384, []byte(c.APISecret))
sig.Write([]byte(payload))
return hex.EncodeToString(sig.Sum(nil))
}
func (c *Client) do(req *http.Request, v interface{}) (*Response, error) {
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
response, err := newResponse(resp)
if err != nil {
return nil, err
}
if v != nil {
err = json.Unmarshal(response.Body, v)
if err != nil {
return nil, err
}
}
return response, nil
}
func (s *WalletsService) All() ([]Wallet, error) {
req, err := s.client.newAuthenticatedRequest("POST", "wallets", nil)
if err != nil {
return nil, err
}
var w []Wallet
_, err = s.client.do(req, &w)
if err != nil {
return nil, err
}
return w, nil
}
The problem is that when i POST
a request, I always get back error [10100] apikey: invalid
. Is it correct to set the payload to {}
when empty? I've tried any possible combination but no way.