c# - 使用 HMAC384 生成对 Nominex 的请求
问题描述
我正在尝试对 Nominex API 进行身份验证,但我找不到向 Nominex 提出的此请求的任何 C# 示例。文档只有 node.js 示例。我正在尝试将其转换为 C# 但运气不佳,不确定我做错了什么。我得到的结果是无效的凭据
JavaScript 中的示例
const crypto = require('crypto')
const request = require('request')
const apiKey = '...'
const apiSecret = '...'
const apiPath = '/api/rest/v1/private/wallets'
const nonce = Date.now().toString()
const queryParams = ''
const body = undefined
let signature = `/api${apiPath}${nonce}${body ? JSON.stringify(body) : ''}`
const sig = crypto.createHmac('sha384', apiSecret).update(signature)
const shex = sig.digest('hex')
const options = {
url: `https://nominex.io/${apiPath}?${queryParams}`,
headers: {
'nominex-nonce': nonce,
'nominex-apikey': apiKey,
'nominex-signature': shex
},
body: body,
json: true
}
request.get(options, (error, response, body) => {
console.log(body);
})
我在 C# 中的尝试
private async Task<string> GetRequest()
{
HttpClient client = new HttpClient();
string secretKey = apiSecret;
TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
long nonce = (long)t.TotalMilliseconds;
string body = "";
string requestPath = "/api/rest/v1/private/orders/BTC/USDT";
string prehashString = string.Join("", requestPath, nonce.ToString(), body);
string digest = "";
using (var hmacsha384 = new HMACSHA384(Encoding.Default.GetBytes(secretKey)))
{
byte[] hashmessage = hmacsha384.ComputeHash(Encoding.Default.GetBytes(prehashString));
bool upperCase = false;
StringBuilder result = new StringBuilder(hashmessage.Length * 2);
for (int i = 0; i < hashmessage.Length; i++)
result.Append(hashmessage[i].ToString(upperCase ? "X2" : "x2"));
digest = result.ToString();
}
HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}{requestPath}");
msg.Content = new StringContent(body, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("nominex-apikey", apiKey);
client.DefaultRequestHeaders.Add("nominex-nonce",nonce.ToString());
client.DefaultRequestHeaders.Add("nominex-signature", digest);
var response = await client.SendAsync(msg);
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
解决方案
签名是:
let signature = `/api${apiPath}${nonce}${body ? JSON.stringify(body) : ''}`
因此他们在 nodejs 示例中的 that之前/api
添加了 a ,因此在这种情况下,签名将是(带有 a of ):apiPath
/api/rest/v1/private/wallets
nonce
1609874861073
/api/api/rest/v1/private/wallets1609874861073
所以
string prehashString = string.Concat("/api", requestPath, nonce.ToString(), body);
并替换所有的Encoding.Default
to Encoding.UTF8
。他们不应该给你任何问题,但有问题就是有问题。
下一次,如果你在你的电脑上安装了 nodejs,你可以在你的 nodejs 上尝试他们的代码,自由添加一些 console.log,否则有一个站点repl.it,你可以在其中尝试一些 node.js 代码(即是我为解决您的问题所做的)。
推荐阅读
- powershell - CMake - 如何轻松添加缺少的库?
- javascript - 处理moment.js的月份日期
- python - 如何从 conda 规范文件为实验创建 AzureML 环境
- python - 树莓派 4 上的 Python 网络浏览器模块
- javascript - 在创建新项目时我应该安装所有 npm 包吗?
- java - Linux 上的 MapReduce Hadoop - 输入中的多个数据
- node.js - Express + Passport + Nginx - req.user 仅在实时环境中为空
- python - 抑制 geopandas 情节图例中的科学记数法
- github - 搜索具有特定 package.json 依赖项的 GitHub 存储库
- reactjs - 使用 useState 设置状态会在第一次调用时产生空数组