Я подключаюсь к 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"
}
Я не уверен, что не так.Но я подозреваю, что это строка предварительного хэша.Спасибо за ваше время.