Недопустимая подпись запроса PUT Coinbase (используется бэкэнд Gamesparks) - PullRequest
0 голосов
/ 12 сентября 2018

Я подключаюсь к Coinbase API с помощью Gamesparks (.com) CloudCode.Используемый язык очень похож на Node.js.Я использую ключ API + секретный метод.

До сих пор я сделал успешные публичные и аутентифицированные вызовы GET.А именно, время и текущие данные пользователя.Я использовал репозиторий Node.js github в качестве места источника, который раскрыл некоторые детали и помог мне в создании собственного скрипта.

Как я уже сказал, я могу успешно выполнить вызов GET auth и получить информацию о моем пользователе.На следующем этапе я хотел изменить свое имя пользователя с помощью метода PUT.

Теперь при попытке сделать запрос PUT я получаю ошибку недопустимой подписи.Который приводит меня к выводу, что сообщение, с которым я работаю, должно быть неверным (поскольку get без тела работает нормально).

Вот код сценария.Я объясню с комментариями.

    /// Coinbase API class.Makes all the required calls and returns the result.

var CoinbaseAPI = new function()
{
    var apiKey = "...";
    var apiSecret = "...";
    var apiVersion = "2018-08-30";
    var baseURL = "https://api.coinbase.com";

    // get unix time in seconds
    var time = Spark.getHttp("https://api.coinbase.com/v2/time").get().getResponseJson().data.epoch;

    ///
    /// GETTERS - public getters. to be used in other scripts.
    ///
    this.getUserDetails = function()
    {
        return makeApiCall("user", null, "GET");
    };

    this.setUsername = function(username)
    {
        var userData = {"username": username};
        return makeApiCall("user", userData, "PUT");
    };


    ///
    /// CALL IMPLEMENTATION
    ///
    function makeApiCall(command, body, method)
    {
        // Gamesparks'http requests class/type
        // Helps with constructing a rest call (SparkHttp: https://docs.gamesparks.com/api-documentation/cloud-code-api/integrations/sparkhttp.html)
        var response;

        // I create the body string, following Node.js source as example
        var bodyStr = body ? JSON.stringify(body) : "";

        // create request data. this is just for easier adding stuff later.
        var req = 
        {
            method: method,
            path: "/v2/" + command,
            bodyString: bodyStr
        };

        // Final url to be called with SparkHttp object
        var cUrl = baseURL + req.path;

        // create the prehash string
        var theMessage = time + req.method + req.path + req.bodyString;

        // create a hexedecimal encoded SHA256 signature of the message
        var sign = Spark.getDigester().hmacSha256Hex(apiSecret, theMessage);

        // just a debug spit in the gamesparks web IDE
        Spark.setScriptData("debug", { prehashString : theMessage, finalURL : cUrl } );

        // create headers
        var headers = 
        {
            "Content-Type" : "application/json",
            "Accept" : "application/json",
            "CB-ACCESS-SIGN": sign,
            "CB-ACCESS-TIMESTAMP": time,
            "CB-ACCESS-KEY": apiKey,
            "CB-VERSION": apiVersion
        };

        if(method === "GET")
        {
            // Make the actual call. Url, headers and call GET method
            response = Spark.getHttp(cUrl).setHeaders(headers).get();

            // Return the json of the SparkHttoResponse (https://docs.gamesparks.com/api-documentation/cloud-code-api/integrations/sparkhttpresponse.html
            return response.getResponseJson();
        }
        else if(method === "PUT")
        {
            // Make the actual call. Url, headers and call PUT json method (has more functions, see link above)
            response = Spark.getHttp(cUrl).setHeaders(headers).putJson(body);
            return response.getResponseJson();
        }

        // return result
        return response.getResponseJson();
    }


}();

И, наконец, отладка.

"result": {
  "errors": [
    {
      "id": "authentication_error",
      "message": "invalid signature"
    }
  ]
},
"debug": {
  "prehashString": "1536701712PUT/v2/user{\"username\":\"newUsername\"}",
  "finalURL": "https://api.coinbase.com/v2/user"
}

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

...