API-клиент Fireblocks на C# ⇐ C#
-
Anonymous
API-клиент Fireblocks на C#
Я пытаюсь использовать API Fireblocks в приложении C# .net 6, но для этого нет документации.
Я попробовал свои ключи на примере JavaScript и уверен, что они работают.
Я попробовал смоделировать FireblocksHttpClient на основе приведенного ими примера Java, и то, что у меня получилось, описано ниже.
Для этого я установил пакет nuget jose-jwt.
Пока создается токен jwt, но когда я отправляю запрос, я получаю в качестве ответа «недопустимое значение опыта».
Могу ли я получить помощь в обновлении класса FireblocksHttpClient, чтобы он мог работать как другие примеры?
Вот код, который я смоделировал по примеру Java:
с использованием System.Security.Cryptography; использование System.Text; общедоступный класс FireblocksHttpClient { частная строка только для чтения baseUrl = "https://api.fireblocks.io"; частная строка только для чтения apiKey; частный RSA PrivateKey только для чтения; частный клиент HttpClient только для чтения; public FireblocksHttpClient (строка apiKey, строка apiSecret) { this.apiKey = apiKey; клиент = новый HttpClient(); byte[] keyBytes = Convert.FromBase64String(apiSecret .Replace("-----НАЧАТЬ ЧАСТНЫЙ КЛЮЧ -----", "") .Replace("-----КОНЕЦ ЧАСТНОГО КЛЮЧА-----", "") .Replace("\n", "")); вар rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(keyBytes, out _); частныйКей = РСА; } общедоступная асинхронная задача Get (строковый путь) { var req = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}{path}"); req.Headers.Add("X-API-Key", apiKey); req.Headers.Add("Авторизация", $"Носитель {SignJwt(путь)}"); используя (var resp = await client.SendAsync(req)) { var body = await resp.Content.ReadAsStringAsync(); вернуть Newtonsoft.Json.Linq.JObject.Parse(тело); } } public async Task Post (строковый путь, данные Newtonsoft.Json.Linq.JObject) { вар req = новый HttpRequestMessage(HttpMethod.Post, $"{baseUrl}{path}"); req.Headers.Add("X-API-Key", apiKey); req.Headers.Add("Авторизация", $"Носитель {SignJwt(path, data.ToString())}"); req.Content = new StringContent(data.ToString(), Encoding.UTF8, "application/json"); используя (var resp = await client.SendAsync(req)) { var body = await resp.Content.ReadAsStringAsync(); вернуть Newtonsoft.Json.Linq.JObject.Parse(тело); } } частная строка SignJwt (путь к строке) { вернуть SignJwt(путь, string.Empty); } частная строка SignJwt (путь к строке, строка dataJSONString) { используя (вар sha256 = SHA256.Create()) { byte[] dataHash = sha256.ComputeHash(Encoding.UTF8.GetBytes(dataJSONString)); строка bodyHash = BitConverter.ToString(dataHash).Replace("-", "").ToLower(); вар сейчас = DateTime.UtcNow; var expires = now.AddSeconds(55); вар jwtClaims = новый { суб = APIKey, ят = сейчас, опыт = срок действия истекает, nonce = Guid.NewGuid().ToString(), ури = путь, bodyHash }; var jwtHeader = новый словарь { { "алг", "RS256" }, { "тип", "JWT" } }; вар PrivateKeyParameters = PrivateKey.ExportParameters (истина); var rsaParams = новые параметры RSAParameters { Модуль = PrivateKeyParameters.Modulus, Экспонента = PrivateKeyParameters.Экспонента, D = PrivateKeyParameters.D, P = PrivateKeyParameters.P, Q = PrivateKeyParameters.Q, ДП = PrivateKeyParameters.DP, DQ = PrivateKeyParameters.DQ, InverseQ = PrivateKeyParameters.InverseQ }; используя (RSA rsa = RSA.Create()) { rsa.ImportParameters(rsaParams); var jwt = Jose.JWT.Encode(jwtClaims, rsa, Jose.JwsAlgorithm.RS256, extraHeaders: jwtHeader); вернуть JWT; } } } } Будем признательны за любые рекомендации.
Я пытаюсь использовать API Fireblocks в приложении C# .net 6, но для этого нет документации.
Я попробовал свои ключи на примере JavaScript и уверен, что они работают.
Я попробовал смоделировать FireblocksHttpClient на основе приведенного ими примера Java, и то, что у меня получилось, описано ниже.
Для этого я установил пакет nuget jose-jwt.
Пока создается токен jwt, но когда я отправляю запрос, я получаю в качестве ответа «недопустимое значение опыта».
Могу ли я получить помощь в обновлении класса FireblocksHttpClient, чтобы он мог работать как другие примеры?
Вот код, который я смоделировал по примеру Java:
с использованием System.Security.Cryptography; использование System.Text; общедоступный класс FireblocksHttpClient { частная строка только для чтения baseUrl = "https://api.fireblocks.io"; частная строка только для чтения apiKey; частный RSA PrivateKey только для чтения; частный клиент HttpClient только для чтения; public FireblocksHttpClient (строка apiKey, строка apiSecret) { this.apiKey = apiKey; клиент = новый HttpClient(); byte[] keyBytes = Convert.FromBase64String(apiSecret .Replace("-----НАЧАТЬ ЧАСТНЫЙ КЛЮЧ -----", "") .Replace("-----КОНЕЦ ЧАСТНОГО КЛЮЧА-----", "") .Replace("\n", "")); вар rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(keyBytes, out _); частныйКей = РСА; } общедоступная асинхронная задача Get (строковый путь) { var req = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}{path}"); req.Headers.Add("X-API-Key", apiKey); req.Headers.Add("Авторизация", $"Носитель {SignJwt(путь)}"); используя (var resp = await client.SendAsync(req)) { var body = await resp.Content.ReadAsStringAsync(); вернуть Newtonsoft.Json.Linq.JObject.Parse(тело); } } public async Task Post (строковый путь, данные Newtonsoft.Json.Linq.JObject) { вар req = новый HttpRequestMessage(HttpMethod.Post, $"{baseUrl}{path}"); req.Headers.Add("X-API-Key", apiKey); req.Headers.Add("Авторизация", $"Носитель {SignJwt(path, data.ToString())}"); req.Content = new StringContent(data.ToString(), Encoding.UTF8, "application/json"); используя (var resp = await client.SendAsync(req)) { var body = await resp.Content.ReadAsStringAsync(); вернуть Newtonsoft.Json.Linq.JObject.Parse(тело); } } частная строка SignJwt (путь к строке) { вернуть SignJwt(путь, string.Empty); } частная строка SignJwt (путь к строке, строка dataJSONString) { используя (вар sha256 = SHA256.Create()) { byte[] dataHash = sha256.ComputeHash(Encoding.UTF8.GetBytes(dataJSONString)); строка bodyHash = BitConverter.ToString(dataHash).Replace("-", "").ToLower(); вар сейчас = DateTime.UtcNow; var expires = now.AddSeconds(55); вар jwtClaims = новый { суб = APIKey, ят = сейчас, опыт = срок действия истекает, nonce = Guid.NewGuid().ToString(), ури = путь, bodyHash }; var jwtHeader = новый словарь { { "алг", "RS256" }, { "тип", "JWT" } }; вар PrivateKeyParameters = PrivateKey.ExportParameters (истина); var rsaParams = новые параметры RSAParameters { Модуль = PrivateKeyParameters.Modulus, Экспонента = PrivateKeyParameters.Экспонента, D = PrivateKeyParameters.D, P = PrivateKeyParameters.P, Q = PrivateKeyParameters.Q, ДП = PrivateKeyParameters.DP, DQ = PrivateKeyParameters.DQ, InverseQ = PrivateKeyParameters.InverseQ }; используя (RSA rsa = RSA.Create()) { rsa.ImportParameters(rsaParams); var jwt = Jose.JWT.Encode(jwtClaims, rsa, Jose.JwsAlgorithm.RS256, extraHeaders: jwtHeader); вернуть JWT; } } } } Будем признательны за любые рекомендации.
Мобильная версия